Ruby中Child / Forked进程的垃圾收集

时间:2014-01-11 19:42:11

标签: ruby-on-rails ruby process garbage-collection

今天我准备好了一篇关于 Ruby的GC(垃圾收集)的文章,我对这几点感到困惑。

假设我们正在使用 Unicorn 来为我们的网站提供服务。 Unicorn使用工作进程来处理请求。工作进程通常是父/主进程的分叉进程。现在我的问题是GC在哪里发生?我的意思是每个分叉进程都有自己的Ruby进程运行副本,并且每个分叉进程分别执行GC或者每个分叉进程使用相同的Ruby进程,即主进程和GC在那里发生吗?如果后者是真的,那么分叉进程如何从父进程共享诸如Ruby之类的东西。

据我所知,每个分叉进程都有自己的Ruby运行版本,当子进程被分叉时会被复制。

非常感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

以前,每个分叉进程都拥有自己进程的整个内存空间的副本。这就是为什么Ruby的基于流程的Web服务器直到最近才需要这么多内存的原因。

从Ruby 2.0开始,分叉进程现在遵循Copy on Write原则。也就是说,分叉进程与其父进程共享尽可能多的数据。这意味着子进程使用的内存比以前少得多,因为它们不再需要复制其父进程的整个内存空间。当子进程需要修改它与其父进程共享的内存的一部分时(或者父进程需要修改它与子进程共享的内存的一部分),子进程将只复制该部分。这就是为什么它被称为Copy on Write:)

关于垃圾收集,这发生在每个Ruby进程中。上述解释应该有助于明确为什么这种方法有效。