对象或块上的JVM记录生成是否计数?

时间:2017-09-29 10:50:54

标签: java garbage-collection jvm

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html,我发现对象的JVM记录生成计数:

  

在下一个小型GC中,伊甸园空间也会发生同样的事情。   删除未引用的对象,并将引用的对象移动到a   幸存者空间。但是,在这种情况下,它们被移动到第二个   幸存者空间(S1)。此外,还有来自上一个次要GC的对象   第一个幸存者空间(S0)的年龄增加并被移动   到S1。一旦所有幸存的物体都被移动到S1,S0和   伊甸园被清除了。请注意,我们现在有不同的老化对象   幸存者空间。

JVM record generation count on object

但是,从Thinking in Java 4th,第124页开始,作者说JVM记录生成计入内存块:

  

如前所述,在此处描述的JVM中分配了内存   在大块。如果分配一个大对象,它将获得自己的块。   严格的停止和复制需要从中复制每个活动对象   将源堆放到新堆中,然后才能释放旧堆   翻译成大量的记忆。使用块,垃圾收集可以   通常在收集时将对象复制到死区。 每个区块都有   生成计数以跟踪它是否还活着。正常   case,只有自上次垃圾回收以来创建的块   压实;所有其他的块如果它们的话,它们的生成计数会被撞   从某个地方引用过。这处理正常情况   很多短暂的临时物品。定期,全扫描   大型物体仍然没有复制(他们只是得到他们的   生成计数碰撞),以及包含小对象的块   复制和压缩。 JVM监视垃圾的效率   收集,如果因为所有对象都浪费时间   长寿,然后它切换到标记和扫描。同样,JVM   跟踪标记和扫描的成功程度,以及堆栈   开始变得支离破碎,它会切换回停止复制。这个   是“自适应”部分的来源,所以你最终会满口:   “自适应世代停止和复制标记 - 并且清除。”

哪一个是正确的?或许他们只是在说些不同的东西?请帮我搞清楚。

1 个答案:

答案 0 :(得分:2)

在HotSpot JVM(Oracle的JVM)中,为对象标题中的对象年龄保留了一些位。位数可能会有所不同,但在任何配置中都至少可以使用4位。

因此,单独跟踪每个对象的年龄。对于HotSpot JVM上可用的所有收集器都是如此。

但是,其他供应商可能采用不同的方法。例如。 Azul Zing跟踪内存块粒度的年龄。