我有一个关于谷歌浏览器中垃圾收集的问题(版本20.0.1132.47,Ubuntu 11.04 64位)。'bound_this'引用的实例只是不被垃圾收集
在比较堆转储和检查内存泄漏时,我发现了一些从未清理过的实例。通常情况下这种行为可以被追踪到一个程序员的错误,但在这种情况下,我宁愿无能..
在下面的截图
实例“孩子@ 610739”被引用看看只能通过属于子实例本身的函数的'bound_this'实例。所以据我的理解,子实例应该被垃圾收集,因为唯一保留它的其他引用是子实例本身(通过'bound_this'函数)。
我使用映射到镀铬的‘native_bind’功能underscore.js' bindAll“效用函数(underscore.js#bindAll)(ECMA Script wiki on bound_this)
我失去了一些东西在这里很明显,如果是这样,可能有人解释什么让这些实例活着?
UPDATE:
在我chrominium测试同一个应用程序的同时(18.0.1025.168(开发版本的Linux 134367)的Ubuntu 11.10),它不显示这些未实例..
更新2:
继Esailijas暗示提供一个jsfiddle片段,我创建了一个(http://jsfiddle.net/8gSTR/1/),模仿我基本上正在做的事情。不幸的是,运行这个小提琴不会显示我在应用程序中遇到的不当行为。而“a'结构实例仍然被引用采取堆转储虽然看起来有点类似,尽管从window.o数组这使活着的情况下,参考:
这样的引用在我的情况是缺少(屏幕截图1)我不知道是什么让Chrome自由释放这些实例...
更新3:
遵循loislos建议来启用隐藏属性。结果(其中一个分支展开)可以在下面的屏幕截图中看到,但它不会让我更进一步。
在这里没有看到这个http://jsfiddle.net/uGX22/3/。起初他们在那里(堆取17。32mb,有60000次关闭),我等了几分钟,拍了一张新快照,堆又回到了6mb,关闭消失了。你能修改我的jsfiddle来重现这个吗? – Esailija 2012-07-20 09:19:14
你能告诉我们你创建这种情况的代码吗?我真的从调试器的屏幕截图中看不到它。 – Bergi 2012-07-20 09:23:09
我会尝试创建一个小片段来重现问题。我创建这种情况的代码是一个相当大的SPA的一部分,因此提取起来并不容易。 – 2012-07-20 09:28:16