如何在堆中分配对象测量时间?

时间:2017-12-10 09:17:53

标签: object garbage-collection object-lifetime

当我读到“The Garbage Collection HandBook”一书时,第9章 暗示:“对象的生命周期更好地通过在他们的出生和死亡之间分配的堆空间的字节数来衡量。”我不太明白这句话。为什么生命周期可以通过分配的字节来衡量?我尝试谷歌,但我得不到答案。 谁能向我解释一下?谢谢!

2 个答案:

答案 0 :(得分:2)

通过在实例化和死亡之间分配的字节数来测量对象的生命周期,GC算法更容易适应程序行为。

如果对象分配的速度非常慢,那么简单的时间测量会显示集合之间的长时间暂停,这看起来很好。但是,如果对象生存期的字节分配测量值很高,则对象可能会过快地提升到幸存者空间或旧生成空间。通过测量字节分配,收集器可以通过扩展年轻代来更有效地优化堆大小,以增加在次要集合发生之前变为垃圾的对象的数量。只是使用时间,因为这个措施不会明显需要堆大小调整。

正如本书所指出的,对于多线程应用程序,很难测量单个线程的字节分配,因此收集器倾向于根据对象存活的集合数量来测量生命周期。这是一个更简单的监控号码,需要更少的记录空间。

答案 1 :(得分:2)

“时间”只是一个允许为活动带来订单的比例。即使在现实世界中,也有许多可能的单位。在计算机内部,出于垃圾收集的目的,没有真实世界的时间单元,所有垃圾收集器通常都想知道,哪个对象比另一个更旧。

为此,只需为每个分配的对象分配一个升序号就足够了,但这意味着要维持一个额外的计数器。相反,分配的字节数是免费的。重要的是我们只累积分配的字节,永远不要减去解除分配的字节,所以我们的数字总是越来越多。

在世代内存管理中,不需要在每次分配时更新此数字,因为对象在专用空间中连续分配,因此它们的地址表示它们在此内存区域中的相对年龄,而区域的起点是与最后一次垃圾收集相关联。只有当垃圾收集器运行并移动幸存的对象时,如果需要,它必须将此信息合并到绝对年龄。

HotSpot JVM等实现进一步简化了这一过程。对于幸存的对象,它维护一个小计数器,保存它存活的垃圾收集周期数。在经过可配置数量的收集周期后,它会被提升到老一代,超过这一点,对象的年龄变得无关紧要。