我们正在使用ZK开发一个单页Web应用程序,该应用程序会不断与服务器通信并更新部分屏幕。更新频率可能高达1 s。在这些更新过程中,对大量 JS 对象的引用会丢失,这些对象最终必须由垃圾收集器清理。
据我们所知,Chrome只在不活跃的标签页上运行垃圾收集器。这对我们来说是个问题,因为应用的标签页通常是活跃的,几乎从不刷新,因此 JS 对象永远不会被收集。如果保持活跃足够长的时间,标签页最终会崩溃(Aww Snap 消息)。
我们需要手动启动垃圾收集,目前为止我们尝试过用--js-flags="--expose-gc"
和gc()
运行Chrome,但是它抛出了一个异常:
ReferenceError: gc is not defined
这在Firefox上不会发生--内存使用或多或少是一个常数。
强制刷新页面不是一个选项。
我们将感谢任何和所有的建议。
编辑:我们已尝试在Chrome版本23.0.1271.97 m
和25.0.1364.2 dev-m
上运行window.gc()
和gc()
3条答案
按热度按时间sf6xfgos1#
您可以获取Chrome开发工具的代码,修改它,以便不时调用
ProfilerAgent.collectGarbage();
(这是一个当您单击时间轴面板上的“收集垃圾”按钮时调用的代码),并使用--debug-devtools-frontend
标志在您的DevTools版本上运行Chrome。然而,这个解决方案是相当极端的,只有当你真的绝望的时候才尝试它。在那之前,我建议分析你的应用程序,并检查为什么v8决定不清理垃圾(或者无法清理垃圾)。DevTools的时间轴面板可以帮助你解决这个问题。首先检查一下这个面板底部的“收集垃圾”按钮是否真的起作用了,如果没有-你可能有一个内存泄漏(至少,根据v8)。如果是这样,尝试leak-finder-for-javascript。
[EDIT]我删除了关于chrome扩展的信息,因为当使用
--js-flags="--expose-gc"
时,gc()
可以从网页代码中调用。至少在我的23.0.1271.64上是这样。djmepvbi2#
在Chrome开发者工具的“性能”标签中,找到一个看起来像垃圾桶的按钮,点击它会强制垃圾收集器运行。
uyto3xhc3#
我找到了一个解决方案。显然Chrome泄露了DOM节点,至少在当前版本中是这样(目前是26. 0. 1410. 65)
我在我的应用程序中记录了开发工具的时间轴,它显示事件侦听器的计数沿着我的应用程序屏幕的内容有节奏地上升和下降,但DOM节点的计数随着时间的推移稳步增加,直到标签崩溃。
我尝试了最新的Chrome Canary(28. 0. 1500. 3),他们似乎已经修复了这个问题。DOM节点计数图现在遵循与事件侦听器相同的节奏模式。
让我不解的是...为什么gmail从来没有崩溃过?我通常一次打开一个标签几个星期...