java - 什么是 Java GC 中的压缩?

标签 java garbage-collection

我读了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/

相关文章:

python - 内部引用防止垃圾收集

java - 在 Spring MVC 中抛出 CustomException 代替 ParseException

Java LocalDate 格式化 2000-1-2 错误

c# - 垃圾收集器是否会在 .NET 中的异步调用期间销毁临时未引用的对象?

java - 年轻一代的垃圾收集器

c# - 是否在垃圾回收期间调用了所有终结器?

java - 如何解决 netbeans 中的库引用问题? java

java - 制作 MacOS 守护程序时我可以选择哪些语言?

java - EJB : Socket connection pooling

c# - 为什么 IntPtr 不需要 unsafe 关键字?