什么是Java GC中的压缩?

时间:2014-07-05 14:11:10

标签: java garbage-collection

我阅读了http://www.cubrid.org/blog/tags/Garbage%20Collection/文章,该文章提供了Java中GC的高级图片。它说:

压缩任务是通过压缩内存来删除内存碎片,以便删除已分配内存区域之间的空白区域

是否应将物体移动到其他位置以填充孔?

我认为对象被移动了。如果是这样,平均地址会发生变化,因此也应更新对该对象的引用?

找到所有后退参考并更新它们似乎太复杂了......

1 个答案:

答案 0 :(得分:3)

是的,任意对象通过内存任意移动,是的,这需要更新对这些对象的引用。也可以使用间接但是various downsides并且我不知道有任何高性能的GC在做它。

确实有些复杂,但就GC优化而言,它是相当温和的。基本的mark-compact工作得很好,它基本上只是按地址顺序遍历所有对象,将它们移动到最小的可用地址,并构建一个包含必要信息的“断点表”(起始地址 - >用于快速修复引用的位移,然后在第二遍中执行。除了任何标记扫描收集器已经需要的信息或簿记(对象类型,引用位置等)之外,这些都不需要信息或簿记。

当您在世代设置中将对象移出托儿所时,您也(大致)知道旧引用的位置。你需要知道要做一个小小的收藏。