有没有办法在基于Webkit的浏览器中强制执行JavaScript垃圾回收?

20

在Internet Explorer中,我们可以通过这个方法来强制执行Javascript垃圾回收:CollectGarbage();

但是,在Firefox上该方法未定义。您是否知道有没有类似的方法?

谢谢。


1
你真正想要解决什么问题?当你的JS线程完成当前的执行线程时,垃圾回收会自动发生。为什么你认为需要显式地运行垃圾回收呢? - jfriend00
同jfriend00所说,你已经标记了[内存泄漏],你是在尝试查找内存泄漏吗?你需要解决的实际问题是什么? - Keldon Alleyne
2
嗨,我的问题是我有一个生成大量垃圾的HTML5游戏,我想在受控情况下调用垃圾回收器(比如暂停菜单)。 - xus
4个回答

26

(不仅限于基于 WebKit 的浏览器...)

  • Chrome:如果您在命令行/终端中使用 --js-flags="--expose-gc" 启动它,则提供了 window.gc()
  • Firefox:我认为需要在 about:memory 中点击“释放内存”按钮。
  • Opera:有 window.opera.collect()
  • Edge:有 window.CollectGarbage()
  • Safari:未知。

请注意,不应手动运行GC。我发布这个只是因为它对开发测试有用。


3

访问about:memory页面。

根据MDN上的文档

about:memory is a special page within Firefox that lets you view, save, 
load, and diff detailed measurements of Firefox's memory usage. It also 
lets you do other memory-related operations like trigger GC and CC

1

我不确定这是否与主题无关,但火狐浏览器有一个叫做FreeMemory(https://addons.mozilla.org/en-US/firefox/addon/freememory/)的插件,可在不访问about:memory面板的情况下运行垃圾回收或循环收集,并具有可配置的计时器。 我相信其他浏览器也有替代方案。


1

我一直在试图强制进行垃圾回收,似乎无论实际浏览器的情况如何,一个相对不错的方法是运行以下代码:

  function gc(max) {
    var arr = [];
    for (var i = 0; i < max; i++) {
      arr.push(i);
    }
    return arr.length;
  }
  for (var i = 0; ; i++) {
    // repeat until you have enough:
    gc(Math.pow(2, i));
  }

当然,一个问题是要知道何时停止调用gc(...):为此,需要一些外部方式来检测GC是否成功完成。在我的情况下,我正在使用嵌入式WebView,并且我可以在强制进行下一轮更大数组之前真正检查。

我很好奇你的检查实际上是为了什么/看什么。我从来没有找到一种可靠的方法来查询内存使用情况(在我的情况下是IE11),以知道何时完成此GC。 - Coty Embry

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