我们正在开发一个单页面的Web应用程序ZK它不断与它的屏幕的服务器和更新部分通信。 更新可以为1s频繁。 在这些更新,JS给对象的大ammounts引用都将丢失,这些对象必须由垃圾回收器最终清洗。
至于我们已经想通了,浏览器只能运行在活动标签页的垃圾收集器。 这对我们来说是一个问题,因为应用程序的标签通常是活跃的,几乎从来没有被刷新,因此JS对象永远不会得到收集。 如果不积极的进行足够的时间,该选项卡崩溃,最终( 噢捕捉消息)。
我们需要手动启动垃圾收集。 到目前为止,我们已经尝试了运行Chrome --js-flags="--expose-gc"
和运行gc()
但它抛出一个异常:
ReferenceError: gc is not defined
这不会在Firefox上发生 - 内存使用情况或多或少是恒定的。
强制刷新页面,是不是一种选择。
我们将是任何和所有的建议表示感谢。
编辑 :我们已经尝试运行window.gc()
和gc()
都在Chrome版本23.0.1271.97 m
和25.0.1364.2 dev-m
您可以获取Chrome浏览器开发工具的代码,修改它,以便ProfilerAgent.collectGarbage();
现在被称为每一个,然后(这是一个当你点击“收集垃圾”时间线面板上的按钮时将调用的代码),并与您的使用DevTools的版本上运行的Chrome --debug-devtools-frontend
标志。
然而,这种解决方案是非常极端的,尝试它,只有当你真的绝望。 在那之前,我建议剖析应用程序,并检查出为什么V8决定不清理垃圾(或无法清除垃圾)。 DevTools的时间轴面板会帮你出这一点。 开始检查,如果“垃圾收集”在这个面板底部的按钮确实它的工作,如果没有 - 你可能有内存泄漏(至少,根据V8)。 如果是这样,尝试泄漏探测器换的JavaScript 。
[ 编辑 ]我除去约铬扩展信息,因为事实证明, gc()
可从网页代码被调用时--js-flags="--expose-gc"
被使用。 至少在我的23.0.1271.64。
在Chrome开发者工具你有“时间线”部分,从身边的Chrome 53,你有没有按钮看起来像垃圾筒。 点击它,它迫使垃圾收集器运行。
我找到了解决办法。 显然,Chrome浏览器泄漏DOM节点,至少在目前的版本(26.0.1410.65现在)
我记录的开发工具的时间表在我的应用程序,它显示了事件监听器计数有节奏以及我的应用程序屏幕内容上上下下,但DOM节点数量稳步随时间增加,直到选项卡崩溃。
我尝试了最新版本的Chrome Canary(28.0.1500.3),他们似乎已经解决了这一问题。 现在DOM节点计数图遵循同样的节奏模式的事件监听器。
这让我的事情是......为什么不Gmail的不断崩溃? 我通常保持标签中打开了几个星期,时间...