我在Oracle网站上找到了“Java Garbage Collection Basic”教程:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

包括以下内容:

世代垃圾收集过程
现在您已经了解了为什么将堆分成不同的世代,现在该看看这些空间之间如何精确地相互作用了。接下来的图片介绍了JVM中的对象分配和老化过程。

首先,将任何新对象分配到eden空间。 两个幸存者空间开始都是空的。


但是在此图像中,“来自”幸存者空间不是空的,它有两个对象,一个是1岁,另一个是3岁。这是错误吗?

最佳答案

不,这不是错误。

该图像只是,而不是,该图像显示了第一个次要垃圾回收之前的情况。链接中的项目2和3指出:


  • 当伊甸园空间填满时,将触发次要垃圾回收。
  • 引用的对象被移到第一个幸存者空间。清除伊甸园空间时,将删除未引用的对象。


  • 因此,在次要垃圾收集期间,伊甸园空间中的引用对象移至幸存者空间,并且每个后续的次要GC都会增加幸存对象的年龄。因此,根据图像,在分配新对象之前,必须至少有3个次要GC。

    10-07 19:40
    查看更多