我试图追踪state_machine gem中的内存泄漏,当我开始使用README 示例中的匿名类动态生成状态机时,我开始注意到它。这个要点展示了我最初是如何发现这个问题的。
我已经能够将问题缩小到在状态机 gem 中定义辅助方法的方式,我已经在这个 gist 中进行了总结。
我的问题是,define_method
导致匿名类不收集垃圾的块在做什么?评论这 3 行(18-20)似乎解决了这个问题。
在此先感谢您的任何指点。
更新:我正在使用 Ruby 2.0.0p195
我试图追踪state_machine gem中的内存泄漏,当我开始使用README 示例中的匿名类动态生成状态机时,我开始注意到它。这个要点展示了我最初是如何发现这个问题的。
我已经能够将问题缩小到在状态机 gem 中定义辅助方法的方式,我已经在这个 gist 中进行了总结。
我的问题是,define_method
导致匿名类不收集垃圾的块在做什么?评论这 3 行(18-20)似乎解决了这个问题。
在此先感谢您的任何指点。
更新:我正在使用 Ruby 2.0.0p195
这篇文章解释了这个问题。
主要的缺点是 define_method 创建了一个闭包。闭包可以保存对大对象的引用,并且这些大对象永远不会被垃圾收集。