在谷歌浏览器中强制垃圾收集

IT技术 javascript google-chrome garbage-collection zk
2021-03-05 00:26:55

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

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

我们需要手动启动垃圾收集。到目前为止,我们已经尝试使用--js-flags="--expose-gc"和 running运行 Chrome gc(),但它抛出了一个异常:

ReferenceError: gc is not defined

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

强制刷新页面不是一个选项。

我们将不胜感激任何和所有建议。

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

3个回答

您可以获取 Chrome Dev Tools 的代码,对其进行修改,以便ProfilerAgent.collectGarbage();不时调用它(这是在您单击“时间轴”面板上的“收集垃圾”按钮时调用的代码),并使用--debug-devtools-frontend标志运行带有您的 DevTools 版本的 Chrome

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

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

有没有办法从javascript调用?
2021-04-15 00:26:55
事实证明,您必须先关闭所有当前的 Chrome 进程,然后才能使用--js-flags. 现在gc()似乎工作。“收集垃圾”按钮也有效。谢谢,你帮了很多忙。
2021-04-24 00:26:55

在 Chrome 开发人员工具中,您有“时间轴”部分,从 Chrome 53 左右开始。您有按钮看起来像垃圾桶。单击它并强制垃圾收集器运行。 在此处输入图片说明

更新:

在较新版本的 Chrome 中,GC 按钮移至性能选项卡。 在此处输入图片说明

较新版本已将收集垃圾按钮移至开发人员工具中的性能选项卡:i.stack.imgur.com/tguqy.png
2021-04-19 00:26:55
是的。您可以按任意次数按它。并且只要你愿意。
2021-04-21 00:26:55
在我的性能和内存选项卡中似乎都有一个。
2021-04-21 00:26:55
我相信在最新的 Chrome 中,这个垃圾按钮现在被添加到记录按钮旁边的内存部分。
2021-05-15 00:26:55

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

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

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

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

好吧,至少他们修复了它。迟到总比没有好:) 感谢您的更新。
2021-05-06 00:26:55