linux - 如何在多线程环境中实现垃圾回收?

标签 linux multithreading memory-management garbage-collection x86

在多线程或多进程的程序中如何进行垃圾回收?

我如何从每个线程和进程中扫描堆栈?

是否每个进程都需要自己的垃圾收集例程?在与实际程序不同的线程/进程中运行垃圾收集器是个好主意吗?

最佳答案

您必须为每个地址空间收集一次。多个线程在同一个地址空间中运行,因此需要一个 GC 来处理这个问题。对于通过生成不同进程运行的程序,每个进程都在自己的地址空间中运行,每个进程可以有一个 GC。

在多线程情况下,将 GC 作为另一个线程运行是有意义的。这样,您就可以调整该线程的优先级,以确保整个程序的运行基本平稳。对于单线程进程,最简单的方法是让 GC 挂接到“正常”内存管理例程(特别是分配),但您可以有两个线程 - 一个线程用于原始进程,一个 GC 线程 - 以,再次确保半平滑性能。

stop-the-world-collectors 是最简单的 - 标记和清除、标记和压缩、停止和复制,应有尽有。 Hook 到单线程程序中的内存管理例程的 GC 本质上是停止世界的。在多线程的情况下,线程调度程序可以为 GC 线程赋予特殊权限(一旦决定运行就使其不可中断),这允许您从这样的特权线程运行 stop-the-world GC。

如果 GC 可能被修改器(即程序的其余部分)中断,特别是因为它只是另一个根本没有得到特殊处理的线程,您将需要一个可以处理干扰的 GC突变体。在这种情况下,您正在查看增量 GC。 IGC 可用于单线程、 Hook 到内存管理例程设置中,它可能会被中断,即通过超时来确保整个系统的平稳运行;它也可以用在多线程系统中,它只是与其他线程竞争运行时间。

我无法告诉您如何找到一个程序或一个程序的所有线程的堆栈,但是应该为每个操作系统记录这些结构的布局。获取 Boehm GC 并扫描源代码以获取提示可能是有意义的。

在将 Jones/Lins 运送给您时,请花一些时间在 http://www.memorymanagement.org/ 上.有关更多信息,正如 Charly Martin 上面所说,Sun 的人员在垃圾收集领域进行了一些惊人的研究和开发,就像 IBM Jikes RVM 团队的成员和同事一样。

编辑:在阅读了您对 Charlie Martin 的评论后,让我给您一个更简洁的建议:将 Boem GC 连接到您的系统并完成它。编写垃圾收集器很容易。编写一个正确、高效、快速、行为良好、调整良好且健壮的垃圾收集器几乎是不可能的。使用现有的 GC 并继续处理项目中有趣的部分。不要被 GC 卡住,或者更糟糕的是,GC 实现不当,这会让您无休止地烦恼。

关于linux - 如何在多线程环境中实现垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/396684/

相关文章:

java - "run a sh file from jsp page code error"

php - 调试休眠的 MySQL 连接

C++ 子线程抛出异常

ios - 当 ARC 在 iOS 中出现时,我们是否还需要使用 xcode 工具(Allocations 和 Leak)?

linux - 主机卷中的符号链接(symbolic link)如何在 Docker 容器中工作?

python - pkg_resources.DistributionNotFound : PIL

javascript - Javascript async 和 await 是否等同于多线程?

multithreading - 连通分量的并行算法

objective-c - iOS ivar alloc/init 分配内存地址给另一个ivar

memory-management - 推荐使用哪种 PyPy 内存分析器?