我对 google chrome(版本 20.0.1132.47,Ubuntu 11.04 64bit)中的垃圾收集有疑问。
在比较堆转储和检查内存泄漏时,我发现了一些从未清理过的实例。通常这种行为可以追溯到程序员错误,但在这种情况下,我相当无能为力..
看看下面的截图
实例“child @610739”仅由属于子实例本身功能的“bound_this”实例引用。所以据我了解,子实例应该被垃圾收集,因为唯一保持它的其他参考是子实例本身(通过'bound_this'函数)。
我正在使用映射到 chrome 的“native_bind”函数的underscore.js 的“bindAll”实用程序函数( underscore.js#bindAll )(bound_this 上的ECMA Script wiki)
我是否在这里遗漏了一些明显的东西,如果是这样,有人可以解释是什么让这些实例保持活力吗?
更新:
与此同时,我在 chrominium (18.0.1025.168 (Developer Build 134367 Linux) Ubuntu 11.10) 中测试了相同的应用程序,它没有显示这些悬空实例。
更新 2:
按照 Esailijas 提示提供一个 jsfiddle 片段,我创建了一个(http://jsfiddle.net/8gSTR/1/)来模仿我基本上在做的事情。不幸的是,运行这个小提琴并没有显示我在我的应用程序中遇到的不当行为。尽管来自 window.o 数组的引用使实例保持活动状态,但在仍然引用“a”实例时进行的堆转储看起来有点相似:
由于在我的情况下缺少这样的参考(屏幕截图 1),我不知道是什么让 chrome 无法释放这些实例......
更新 3:
遵循 loislos 的建议以启用隐藏属性。结果(其中一个分支展开)可以在下面的屏幕截图中看到,但它不会让我更进一步。