低暂停GC背后的算法是什么?


12

某些语言(例如Java)引入了低暂停GC。

这些GC可以完成大部分工作,而不会暂停整个世界。这显然是一个相当棘手的问题,因为它需要在线程修改内存时对其进行分析,从而导致可以在进程开始时使用该数据,而在完成时不再使用该数据,或者似乎是垃圾的数据,但是因为参考已移动到内存中,并且从未出现在GC所寻找的位置。

因此,基本上来说,其背后的算法是什么?

研究论文或真正技术文章的链接将被视为有效答案,因为该主题确实是技术性的。

Answers:


16

因此,基本上,其背后的算法是什么?

它基本上是一个标记和清除算法,“仅” 在一个单独的线程中同时运行

至于关于该主题的研究论文:


5

据我了解,Java G1垃圾收集器使用所谓的堆区域来避免暂停整个世界。我看到的方式是,虽然其中一个区域被GC执行清除锁定,但内存分配是在另一个区域中完成的。

这是杰里米·曼森(Jeremy Manson的解释

原理很简单:收集器将堆分成固定大小的区域,并跟踪这些区域中的实时数据。它将一组指针(“记住的集”)保留到区域中或从区域中移出。当认为有必要使用GC时,它将首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这意味着一步就可以收集整个区域:如果进入一个区域的指针数量为零,则不需要对该区域进行标记或扫描...


5

IBM的实时JVM使用称为Metronome的垃圾收集器,该垃圾收集器将GC活动拆分为离散的量子,并将它们与应用程序处理交织在一起。因此,基本上,它不是周期性的(和不确定性的)GC暂停,而是在并行执行GC时,应用程序的运行速度稍慢一些。

还有另一个可以进行动态碎片整理并满足硬实时要求的GC,但是我可以在这里找到唯一的参考(需要ACM成员资格)。

一个有趣的并发实时垃圾收集器是无止境的。它使用传统的标记扫掠方法,但专为在多处理器系统上使用而设计,并支持无锁并发多线程。


不错!太糟糕了,我无法访问ACM,本文看起来真的很有趣。
deadalnix

2

它起作用的原因是因为在Java中,只有GC才能释放可能包含GC引用的内存。这意味着只要您可以安全地在单独的线程中读取对象,则只需暂停程序即可观察堆栈上的引用。

对于突变,我建议他们实施某种形式的写时复制功能,以告知GC有关更改。


只要那些引用可以在任何时间由任何线程更新,那是不够的。
deadalnix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.