【发布时间】:2013-11-16 21:45:03
【问题描述】:
我记录了以下Chrome bug,这导致我的代码中有许多严重且不明显的内存泄漏:
(这些结果使用 Chrome 开发工具的memory profiler,它运行 GC,然后对所有未垃圾收集的内容进行堆快照。)
在下面的代码中,someClass 实例被垃圾回收(好):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
但在这种情况下不会被垃圾收集(坏):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
以及对应的截图:
似乎闭包(在本例中为function() {})如果对象被同一上下文中的任何其他闭包引用,则无论该闭包本身是否可访问,都可以使所有对象保持“活动状态”。
我的问题是关于其他浏览器(IE 9+ 和 Firefox)中闭包的垃圾收集。我对 webkit 的工具很熟悉,比如 JavaScript heap profiler,但是我对其他浏览器的工具知之甚少,所以我一直无法测试。
在这三种情况下,IE9+ 和 Firefox 会垃圾收集someClass实例?
【问题讨论】:
-
对于初学者来说,Chrome 如何让您测试哪些变量/对象被垃圾回收,以及何时发生?
-
也许控制台会保留对它的引用。当你清除控制台时它会被 GCed 吗?
-
@david 在最后一个示例中,
unreachable函数从未执行,因此实际上没有记录任何内容。 -
我很难相信这么重要的错误已经发生了,即使我们似乎面对事实。但是我一次又一次地查看代码,我没有找到任何其他合理的解释。你试图完全不在控制台中运行代码(也就是让浏览器从加载的脚本中自然地运行它)?
-
@some,我以前读过那篇文章。它的副标题是“处理 JavaScript 应用程序中的循环引用”,但 JS/DOM 循环引用的问题不适用于现代浏览器。它提到了闭包,但在所有示例中,有问题的变量仍然可能被程序使用。
标签: javascript internet-explorer google-chrome firefox garbage-collection