1

我试图追踪state_machine gem中的内存泄漏,当我开始使用README 示例中的匿名类动态生成状态机时,我开始注意到它。这个要点展示了我最初是如何发现这个问题的。

我已经能够将问题缩小到在状态机 gem 中定义辅助方法的方式,我已经在这个 gist 中进行了总结。

我的问题是,define_method导致匿名类不收集垃圾的块在做什么?评论这 3 行(18-20)似乎解决了这个问题。

在此先感谢您的任何指点。

更新:我正在使用 Ruby 2.0.0p195

4

1 回答 1

1

这篇文章解释了这个问题。

主要的缺点是 define_method 创建了一个闭包。闭包可以保存对大对象的引用,并且这些大对象永远不会被垃圾收集。

于 2013-07-12T15:53:32.340 回答