【问题标题】:Will console.log prevent garbage collection?console.log 会阻止垃圾收集吗?
【发布时间】:2015-05-04 13:37:13
【问题描述】:

如果我有一个通常会被垃圾回收的对象,但已记录到控制台,它是否仍然有资格进行垃圾回收?

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

// Can o be collected?

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

编辑:我认为这不会影响基于在 Chrome 开发工具中查看堆的收集资格。但是任何类型的控制台写入都会这样做吗?

【问题讨论】:

  • Chrome 有时会为记录的对象添加注释,例如“首次扩展时评估”。这表明该对象可能同时已被 GCd。但它也可以只指修改。
  • @Thomas 我很确定它指的是修改。

标签: javascript


【解决方案1】:

如果你将一个对象记录到控制台,它就不会被垃圾回收。

您可以通过在 chrome 控制台中输入来验证这一点:

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

转到“配置文件”和“获取堆快照”。这将自动进行垃圾收集。搜索类“Foo”。 “对象数”列中将有一个1

【讨论】:

  • 我自己的实验通过查看堆分配的内存得出了相反的结论。重现步骤:打开开发工具,强制垃圾回收,运行代码,强制垃圾回收。我的测试显示分配的内存已被释放。但是我可能会被误导。
  • 你在最后一次垃圾回收后拍了堆快照吗?
  • 我在 Linux 上使用 Google Chrome 41.0.2272.76(64 位)。您的 Chrome 版本是多少?
  • @hhelwich '“获取堆快照”。这将使用 Chrome Version 79.0.3945.117 (Official Build) (64-bit) 自动进行垃圾收集,这句话似乎不再正确。我拍摄了一个堆快照,存在一些我认为应该被 GC 处理的对象,我手动“收集垃圾”并拍摄了另一个堆快照,但它们消失了。
猜你喜欢
  • 2015-10-08
  • 2022-01-11
  • 2010-09-22
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多