每当启用console.log时,使用以下代码,o.big引用的String将不会被垃圾回收。一旦删除了日志语句,处理程序函数执行完成后就会释放大字符串的内存。
我使用的是Firefox 9.0.1,内存分析是通过about:memory完成的。
$(function() {
var handler = function() {
var o = {};
o.big = (new Array(20*1024*1024)).join("x");
console.log(o.big);
delete o.big;
};
$("#btn").click(handler);
});
我对JavaScript很陌生,如果有人可以向我指出为什么如果在console.log中使用了字符串不会被gc标记,那将会很棒。
答案 0 :(得分:2)
虽然我不太熟悉Firefox的/ Firebug对console.log()
的处理,但我认为显示“已记录”对象的控制台提供了一种检查和交互的方法。这至少适用于Chrome。
因此,控制台需要对该对象的引用,该对象将保留在内存中,并且在控制台释放引用之前不能进行垃圾回收(这可能在重新加载承载脚本的页面之前不会发生)。
最后,请记住delete
operator和垃圾收集之间没有明确的关系。
答案 1 :(得分:0)
不确定Firefox是否保留对原始字符串的引用。我认为console.log()
保留了副本,因为字符串是JS中的一等成员。
您可以在string-chars
中看到about:memory
内存使用率下降,但heap-unclassified
上升。这可能与https://bugzilla.mozilla.org/show_bug.cgi?id=563700有关,或者可能意味着FF的GC已被破坏。