【发布时间】:2012-07-19 13:18:25
【问题描述】:
我对 google chrome(版本 20.0.1132.47,Ubuntu 11.04 64 位)中的垃圾收集有疑问。
在比较堆转储和检查内存泄漏时,我发现了一些从未清理过的实例。通常这种行为可以追溯到程序员错误,但在这种情况下,我相当无能..
看看下面的截图
实例“child @610739”仅由属于子实例本身函数的“bound_this”实例引用。因此,据我了解,子实例应该被垃圾收集,因为保持它的唯一其他引用是子实例本身(通过 'bound_this' 函数)。
我正在使用 underscore.js 的 'bindAll' 实用函数 (underscore.js#bindAll),它映射到 chrome 的 'native_bind' 函数 (ECMA Script wiki on bound_this)
我是否在这里遗漏了一些明显的东西,如果有,有人可以解释是什么让这些实例保持活力吗?
更新:
与此同时,我在 chrominium (18.0.1025.168 (Developer Build 134367 Linux) Ubuntu 11.10) 中测试了相同的应用程序,它没有显示这些悬空实例..
更新 2:
按照 Esailijas 提示提供一个 jsfiddle sn-p,我创建了一个 (http://jsfiddle.net/8gSTR/1/) 来模仿我基本上正在做的事情。不幸的是,运行这个小提琴并没有显示我在我的应用程序中遇到的不当行为。尽管来自 window.o 数组的引用使实例保持活动状态,但在仍然引用“a”实例时进行的堆转储看起来有点相似:
在我的案例中缺少这样的引用(屏幕截图 1)我不知道是什么让 chrome 无法释放这些实例...
更新 3:
遵循 loislos 的建议以启用隐藏属性。结果(其中一个分支已展开)可以在下面的屏幕截图中看到,但它并没有让我更进一步。
【问题讨论】:
-
这里没有看到这个jsfiddle.net/uGX22/3。最初它们在那里(堆占用 17.32mb 和 60000 个闭包),我等了几分钟并拍摄了一个新快照,堆又回到了 6mb 并且闭包消失了。你能修改我的 jsfiddle 来重现这个吗?
-
你能告诉我们你创建这种情况的代码吗?我并没有真正从调试器的屏幕截图中得到它。
-
我将尝试创建一个小 sn-p 来重现该问题。我创建这种情况的代码是一个相当大的 SPA 的一部分,所以提取起来并不容易。
-
与此同时,我在 chrominium (18.0.1025.168 (Developer Build 134367 Linux) Ubuntu 11.10) 中测试了相同的应用程序,它没有显示这些悬空实例..
-
能否请您在常规设置对话框中启用显示对象的隐藏属性复选框(它隐藏在 DevTools 右下角的齿轮图标下)并关闭/打开 devtools 窗口
标签: javascript google-chrome memory memory-leaks google-chrome-devtools