java - 是什么导致对象从新生代移动到老年代

标签 java garbage-collection jvm

经过多次GC循环后,新生代存活下来的对象被移动到老年代的内存空间。

请澄清,Minor GC 对此负责?还是主要 GC?

最佳答案

Please clarify, Minor GC is responsible for this ? or Major GC?

他们中的任何一个都负责将对象从年轻一代移动到老一代。

查看“一般垃圾收集过程”部分@oracle garbage collection tutorial

enter image description here

总结:

  1. 首先,任何新对象都被分配到伊甸园空间。两个幸存者空间一开始都是空的。

  2. 当 eden 空间填满时,会触发次要垃圾回收

  3. 引用的对象被移动到第一个幸存者空间。清除伊甸园空间时,将删除未引用的对象。

  4. 在下一次次要 GC 中,伊甸园空间也会发生同样的事情。未引用的对象被删除,引用的对象被移动到幸存者空间。然而,在这种情况下,它们被移动到第二个幸存者空间(S1)

  5. 在下一次次要 GC 中,重复相同的过程。然而这次幸存者空间发生了变化。引用的对象被移动到 S0。幸存的对象是老化的。 Eden 和 S1 被清除。

  6. Minor GC 之后,当老化的对象达到某个年龄阈值(本例中为 8)时,它们会从年轻代提升到老年代。

  7. 随着次要 GC 不断发生,对象将继续被提升到老年代空间。

  8. 最终,将对老年代执行主要 GC,清理并压缩该空间。

关于java - 是什么导致对象从新生代移动到老年代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39932939/

相关文章:

java - 在多个计算节点上运行相同的Java程序

Java GC : why two survivor regions?

java - 如果在 WSDL 中定义了 `xsd:struct` (Key => Value Map),如何处理 Wsdl2Java?

java - 为什么这个类中的某些构造函数使用 this(context) 而不是 super(context)?

c# - 计时器在 Web 服务中 20 分钟后停止工作

java - String.valueOf(int) 中的 ArrayOutOfBoundsException 怎么可能发生?

java - 库存跟踪器中的方法存在问题

java - 如何从单独的主 java 文件调用此方法?

c# - readonly 修饰符会影响垃圾收集器吗?

java - java中的中断线程