当前位置: 代码迷 >> 综合 >> [翻译]Java Garbage Collection Basics Java 垃圾回收基础 之4 分代的垃圾回收过程
  详细解决方案

[翻译]Java Garbage Collection Basics Java 垃圾回收基础 之4 分代的垃圾回收过程

热度:14   发布时间:2024-01-11 07:38:35.0

分代的垃圾回收过程

现在我们知道了为什么堆被分为不同代,那么用一点时间来看看这些不同代之间是如何交付的.下面的这些图片描述了在JVM中.对象的分配和变老的过程.
1.任何新创建的对象都在eden区分配,2个survivor都是空的.
这里写图片描述

2.当eden区满了,会触发一次minor gc
这里写图片描述

3.此时还被引用的对象会移到第一个Survivor区S0.清除Eden区时,未被引用的对象被删除
这里写图片描述

4.在下次minor gc时,在eden区发生同样的事情.未被引用的对象被清除,被引用的对象被移到survivor区.不同的是,在这种情况下,它们被移入第2个survivor区 S1.除此之外,上次MINOR GC在 S0中存活的对象,变老了,并被移入到S1.当所有存活的对象都被移入到S1后,S0和eden区被清空了.注意观察下图中不同动向如何变老的.
这里写图片描述

5.下次minor gc,同样重复上面的过程.但是survivor区被调换了.被引用的对象被移入到S0, 存活对象变老了.eden区和S1被清空了.
这里写图片描述
6.下图展示了”提升/晋升”过程.在一次minor gc执行完后,年老的对象达到了特定的年龄阈值(比如8),这些对象从年轻代晋升到年老代.(译注:可以通过JVM参数:-XX:MaxTenuringThreshold=8 设置.)
这里写图片描述

7.随着更多的minor gc,更多的对象会晋升到年老代.
这里写图片描述

8.接着更多的对象从年轻代晋升到老年代.最终触发一次major gc用于清除和压缩年老代.

这里写图片描述

  相关解决方案