我读了http://www.cubrid.org/blog/tags/Garbage%20Collection/这篇文章给出了 Java 中 GC 的高级图片。它说:
压缩任务是通过压缩内存来移除内存碎片,以移除已分配内存区域之间的空白空间。
是否应该将物体移到其他地方以填充洞?
我认为对象是移动的。如果是这样,意味着地址已更改,那么对该对象的引用也应该更新吗?
找到所有反向引用并更新它们似乎是一项非常复杂的任务...
最佳答案
是的,任意对象在内存中任意移动,是的,这需要更新对这些对象的引用。也可以使用间接寻址,但有 various downsides而且我不知道有任何高性能 GC 会这样做。
它确实有些复杂,但就 GC 优化而言,它是相当良性的。基本mark-compact工作得很好,它基本上只是按地址顺序遍历所有对象,将它们移动到最小的可用地址,并构建一个“中断表”,其中包含用于快速修复引用的必要信息(起始地址 -> 位移) ,然后它会在第二遍中执行此操作。这些都不需要任何标记清除收集器已经需要的信息或簿记(对象类型、引用位置等)。
当您将对象移出代际环境中的托儿所时,您也(大致)知道旧引用的位置。您需要知道这一点才能进行小型 Collection 。
关于java - 什么是 Java GC 中的压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24587255/