【发布时间】:2011-04-27 14:23:13
【问题描述】:
我们目前正在使用 JRuby 运行 Resque,但遇到了内存泄漏问题。 Resque 和 Ruby/REE 的优点之一是它使用了 fork 语义,将内存泄漏隔离到每个作业而不是每个 VM 基础(每个作业的 fork)。
看起来没有任何用于分叉 JVM 的选项是有意义的,但想知道是否可以通过将内存隔离到线程来做一些事情,因此在线程中发生停止事件时,该线程创建的所有内存都会被销毁,无论如何没有仍然引用它。
【问题讨论】:
我们目前正在使用 JRuby 运行 Resque,但遇到了内存泄漏问题。 Resque 和 Ruby/REE 的优点之一是它使用了 fork 语义,将内存泄漏隔离到每个作业而不是每个 VM 基础(每个作业的 fork)。
看起来没有任何用于分叉 JVM 的选项是有意义的,但想知道是否可以通过将内存隔离到线程来做一些事情,因此在线程中发生停止事件时,该线程创建的所有内存都会被销毁,无论如何没有仍然引用它。
【问题讨论】:
线程当然不是进程。如果您使用线程,您将与进程的其余部分共享一个公共内存池,因此实际上没有任何“由该线程创建的内存”的概念。可以实现一个虚拟机,让线程拥有自己的内存空间,但在 JRuby 的情况下,它首先会破坏拥有本地线程的许多好处。
我的建议是与 JRuby 团队(例如我)一起找出泄漏的原因,我们会修复它。 MRI 方法是一种丑陋的创可贴,只会让人懒于代码中的内存和资源管理。
【讨论】: