Firefox console.log阻止JavaScript字符串被垃圾收集?

时间:2012-01-04 14:47:45

标签: javascript string firefox garbage-collection

每当启用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标记,那将会很棒。

2 个答案:

答案 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已被破坏。