从http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html,我发现对象的JVM记录生成计数:
在下一个小型GC中,伊甸园空间也会发生同样的事情。 删除未引用的对象,并将引用的对象移动到a 幸存者空间。但是,在这种情况下,它们被移动到第二个 幸存者空间(S1)。此外,还有来自上一个次要GC的对象 第一个幸存者空间(S0)的年龄增加并被移动 到S1。一旦所有幸存的物体都被移动到S1,S0和 伊甸园被清除了。请注意,我们现在有不同的老化对象 幸存者空间。
但是,从Thinking in Java 4th,第124页开始,作者说JVM记录生成计入内存块:
如前所述,在此处描述的JVM中分配了内存 在大块。如果分配一个大对象,它将获得自己的块。 严格的停止和复制需要从中复制每个活动对象 将源堆放到新堆中,然后才能释放旧堆 翻译成大量的记忆。使用块,垃圾收集可以 通常在收集时将对象复制到死区。 每个区块都有 生成计数以跟踪它是否还活着。正常 case,只有自上次垃圾回收以来创建的块 压实;所有其他的块如果它们的话,它们的生成计数会被撞 从某个地方引用过。这处理正常情况 很多短暂的临时物品。定期,全扫描 大型物体仍然没有复制(他们只是得到他们的 生成计数碰撞),以及包含小对象的块 复制和压缩。 JVM监视垃圾的效率 收集,如果因为所有对象都浪费时间 长寿,然后它切换到标记和扫描。同样,JVM 跟踪标记和扫描的成功程度,以及堆栈 开始变得支离破碎,它会切换回停止复制。这个 是“自适应”部分的来源,所以你最终会满口: “自适应世代停止和复制标记 - 并且清除。”
哪一个是正确的?或许他们只是在说些不同的东西?请帮我搞清楚。
答案 0 :(得分:2)
在HotSpot JVM(Oracle的JVM)中,为对象标题中的对象年龄保留了一些位。位数可能会有所不同,但在任何配置中都至少可以使用4位。
因此,单独跟踪每个对象的年龄。对于HotSpot JVM上可用的所有收集器都是如此。
但是,其他供应商可能采用不同的方法。例如。 Azul Zing跟踪内存块粒度的年龄。