强制在Google Chrome中收集垃圾

Pau*_* K. 44 javascript garbage-collection google-chrome zk

我们正在开发一个带有ZK的单页Web应用程序,它不断与服务器通信并更新其部分屏幕.更新频率可以达到1秒.在这些更新期间,对大型JS对象的引用将丢失,并且最终必须由垃圾收集器清理这些对象.

据我们所知,Chrome只在非活动标签上运行其垃圾收集器.这对我们来说是一个问题,因为应用程序的选项卡通常是活动的,几乎从不刷新,因此JS对象永远不会被收集.如果保持活动状态足够长时间,则选项卡最终会崩溃(Aww Snap消息).

我们需要手动启动垃圾收集.到目前为止,我们已尝试运行Chrome --js-flags="--expose-gc"并运行gc(),但它会引发异常:

ReferenceError: gc is not defined
Run Code Online (Sandbox Code Playgroud)

这不会发生在Firefox上 - 内存使用或多或少是一个常数.

强制刷新页面不是一种选择.

我们将不胜感激任何建议.

编辑:我们已经尝试运行window.gc()gc()双方在Chrome版本23.0.1271.97 m25.0.1364.2 dev-m

Kon*_*nel 38

您可以获取Chrome开发工具的代码,对其进行修改,以便随时ProfilerAgent.collectGarbage();调用(当您单击"时间轴"面板上的"收集垃圾"按钮时调用该代码)并使用您的DevTools版本使用--debug-devtools-frontend标记运行Chrome .

但是,这个解决方案非常极端,只有当你真的绝望时才尝试.到那时,我建议分析你的应用程序,并检查为什么v8决定不清理垃圾(或不能清理垃圾).DevTools的时间轴面板将帮助您解决这个问题.首先检查这个面板底部的"收集垃圾"按钮是否真的能完成它的工作,如果没有 - 你可能有内存泄漏(至少,根据v8).如果是这样,请尝试使用leak-finder-for-javascript.

[ 编辑 ]我删除了有关chrome扩展的信息,因为事实证明gc()可以在--js-flags="--expose-gc"使用时从网页代码调用.至少在我23.0.1271.64.

  • 事实证明,在使用`--js-flags`打开之前,您必须关闭所有当前的Chrome进程.现在`gc()`似乎有效."收集垃圾"按钮也有效.谢谢,你帮了很多忙. (4认同)
  • 有没有办法从javascript调用? (2认同)

Nis*_*eph 26

在Chrome开发者工具中,您可以在Chrome 53周围找到"时间轴"部分.您可以使用垃圾桶按钮.点击它,它强制垃圾收集器运行. 在此输入图像描述

  • 较新版本已将Collect垃圾按钮移至开发人员工具中的性能选项卡:https://i.stack.imgur.com/tguqy.png (10认同)

小智 5

我找到了解决方案。显然 Chrome 泄漏了 DOM 节点,至少在当前版本中(现在是 26.0.1410.65)

我在我的应用程序中记录了开发工具时间线,它显示事件侦听器计数随着我的应用程序屏幕的内容有节奏地上升和下降,但 DOM 节点数随着时间的推移稳步增加,直到选项卡崩溃。

我尝试了最新的 Chrome Canary (28.0.1500.3),他们似乎已经解决了这个问题。DOM 节点计数图现在遵循与事件侦听器相同的节奏模式。

让我感到困惑的是……为什么 gmail 永远不会崩溃?我通常一次打开一个标签数周...