console.log会阻止垃圾回收吗?

21

如果我有一个本来应该被垃圾回收的对象,但是已经被记录到控制台了,那么它还会被垃圾回收吗?

(function(){
  var o = { foo: {} }; 
  console.log(o);
}())

// Can o be collected?

如果是这样,是否存在任何情况下写入控制台(使用其任一方法)会影响垃圾回收的资格?

编辑:我不认为这会影响可在 Chrome 开发工具中监视堆的垃圾回收资格。但是,任何写入控制台的类别是否会影响垃圾回收资格呢?


5
有时Chrome会在记录的对象中添加注释,比如“第一次展开时计算”。这可能暗示该对象在此期间已被垃圾回收。但也可能只是指修改。 - Thomas
@Thomas 我很确定它指的是修改。 - Scimonster
1个回答

6

如果您将对象记录到控制台中,它将无法进行垃圾回收。

您可以通过在Chrome控制台中输入以下内容来验证此操作:

var Foo = function() {};
console.log(new Foo());

前往“Profiles”并选择“Take Heap Snapshot”。这将自动进行垃圾回收。搜索类“Foo”。在“Objects count”列中将显示1


通过查看堆分配的内存,我的实验得出了相反的结论。重现步骤:打开开发工具,强制进行垃圾回收,运行您的代码,再次强制进行垃圾回收。我的测试显示已分配的内存已被释放。但是我可能会被误导。 - Ben Aston
你在上一次垃圾回收后拍了堆快照吗? - hhelwich
我正在Linux上使用Google Chrome 41.0.2272.76(64位)。你的Chrome版本是多少? - hhelwich
@hhelwich说:“Take Heap Snapshot”。这将自动进行垃圾收集。使用Chrome 版本79.0.3945.117(官方构建)(64位),这个语句似乎不再正确。我拍了一个堆快照,发现一些对象还在内存中,我手动进行了“收集垃圾”,然后再次拍摄堆快照,它们消失了。 - Morvael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接