Java GC中的压缩是什么?

4
我读了一篇关于Java中垃圾回收的高层次概述文章,链接为http://www.cubrid.org/blog/tags/Garbage%20Collection/。该文章提到:
紧缩任务的目的是通过压缩内存来消除内存碎片,从而消除已分配内存区域之间的空白空间。
那么对象是否应该移动到其他位置以填补空洞呢?
我认为对象是被移动的,如果是这样,那么地址也会发生改变,因此对该对象的引用也应该更新?
寻找所有的反向引用并进行更新似乎是一项过于复杂的任务...
1个回答

5

是的,任意对象在内存中都会被任意移动,这需要更新对这些对象的引用。也可以使用间接引用,但这有各种缺点,我不知道有哪个高性能GC在使用。

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

而且,在一代设置中,当您将对象从幼儿园中移出时,您还知道(大致)旧引用的位置。您需要知道这一点才能进行小型收集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接