如何在由多个线程或进程组成的程序中执行垃圾收集?
如何从每个线程和进程中扫描堆栈?
每个进程是否都需要自己的垃圾收集例程?在与实际程序不同的线程/进程中运行垃圾收集器是一个好主意吗?
答案 0 :(得分:7)
答案 1 :(得分:7)
每个地址空间必须收集一次。多个线程在同一个地址空间中运行,因此需要有一个GC来处理这个问题。对于通过生成不同进程来运行的程序,每个进程都在自己的地址空间中运行,每个进程可以有一个GC。
在多线程情况下,将GC作为另一个线程运行是有意义的。这样,您可以调整该线程的优先级,以确保整个程序的大致平稳运行。对于单线程进程,最简单的方法是将GC挂钩到“正常”的内存管理例程(特别是分配),但是你可以有两个线程 - 一个用于原始进程的线程和一个GC线程 - 到再次,确保半光滑的表现。
世界上最先进的收藏家是最简单的 - 标记和扫描,标记和紧凑,停止和复制,你的名字。在单线程程序中挂钩到内存管理例程的GC本质上是世界性的。在多线程情况下,线程调度程序可以为GC线程赋予特殊权限(一旦它决定运行就使其不可中断),这允许您从这样的特权线程运行一个停止世界的GC。
如果GC可以被mutator中断(即程序的其余部分),特别是因为它只是另一个根本没有得到特殊处理的线程,你需要一个可以处理干扰的GC。变异者。在这种情况下,您正在查看增量GC。 IGC可以用于单线程,钩入内存管理例程设置,在那里它可以被中断,即通过超时来确保整个系统的稍微平稳的操作;它也可以用在多线程系统中,它只是与其他线程竞争运行时间。
如何找到程序或程序的所有线程的堆栈,我无法告诉您,但应记录每个操作系统的这些结构的布局。抓住Boehm GC并扫描信息来源可能是有意义的。
当Jones / Lins被运送给你时,请花一些时间在http://www.memorymanagement.org/。有关更多信息,正如Charly Martin上面所说,Sun的人们在垃圾收集领域做了一些惊人的研究和开发,就像IBM Jikes RVM团队的成员和同事一样。
编辑:在阅读了对Charlie Martin的评论之后,让我给你一个更为简单的建议:将Boem GC连接到你的系统并完成它。编写垃圾收集器很容易。编写一个正确,高效,快速,良好的性能,良好调整和健壮的垃圾收集器几乎是不可能的。使用现有的GC并转到项目的有趣部分。不要被GC困住,或者更糟糕的是,有一个糟糕的GC实现,这会让你烦恼不已。
答案 2 :(得分:2)
您为什么要使用拥有 GC?或者您只是想了解一般的GC? Jones和Lin的书Hrvoje建议非常好,Wikipedia文章看起来并不坏。
1.4.2之后的Java提供了一种增量混合GC,它不会强制“阻止世界”停止;我们需要这样做来处理面向设备的Java,例如Java ME世界。在Sun java网站上有一个非常好的extended paper。
答案 3 :(得分:1)
大多数GC环境(例如Java和.NET)在垃圾回收期间都会暂停所有线程。
答案 4 :(得分:1)
这是blog for Maoni Stephens。她是.Net GC的当前主要开发人员。
这是一个post on concurrent GC,它讨论了.Net GC在这种情况下的工作原理。