在Java虚拟机中,对象通常在新生代(Young Generation)中被分配内存,而年轻代又分为三个部分:Eden区、Survivor区1(S0)和Survivor区2(S1)。大部分对象在新生代中经历了多次垃圾回收后仍然存活,它们会被移动到老年代(Old Generation)。这个过程通常称为对象的年龄晋升。
下面是对象从年轻代晋升到老年代的基本过程:
-
对象在Eden区分配:
- 刚创建的对象通常会被分配到Eden区。
-
Minor GC触发:
- 当Eden区满时,会触发一次Minor GC,清理掉Eden区和Survivor区中不再存活的对象。
-
存活对象进入Survivor区:
- 在Minor GC过程中,仍然存活的对象会被移动到Survivor区。一般情况下,存活的对象会经过一定数量的Minor GC后,逐渐晋升到Survivor区。
-
对象年龄增加:
- 每次经过Minor GC后,存活的对象的年龄都会增加一岁。对象的年龄通过每次在Survivor区中存活都会增加一岁,直到达到某个阈值。
-
对象晋升到老年代:
- 当对象的年龄达到一定阈值时,一般由虚拟机参数
-XX:MaxTenuringThreshold
指定,默认为15,对象将被晋升到老年代。
- 当对象的年龄达到一定阈值时,一般由虚拟机参数
-
Full GC触发:
- 当老年代空间不足时,会触发一次Full GC,清理老年代中的垃圾对象。
这个过程中,对象的晋升到老年代是逐步的,经过多次的Minor GC,只有经过一定次数的存活判定后,对象才会被晋升到老年代。这种策略称为分代垃圾回收,通过将对象划分为不同的代(年轻代和老年代),可以更有效地进行垃圾回收,提高垃圾回收的效率。这也是Java虚拟机采用的一种经典的垃圾回收策略。
Was this helpful?
0 / 0