强制在Google Chrome中进行垃圾回收
我们正在开发一个ZK单页网页应用程序不断与服务器通信,并更新其部分屏幕。 更新可以像1s一样频繁。 在这些更新期间,大量的JS对象的引用将丢失,最终这些对象必须由垃圾回收器清理。
就我们所知,Chrome只在非活动选项卡上运行垃圾收集器。 这对我们来说是一个问题,因为应用程序的选项卡通常是活动的,几乎从不刷新,所以JS对象永远不会被收集。 如果保持足够的时间,标签最终崩溃( Aww Snap消息)。
我们需要手动启动垃圾回收。 到目前为止,我们已经尝试使用--js-flags="--expose-gc"
运行Chrome并运行gc()
,但是它会抛出一个exception:
ReferenceError: gc is not defined
这不会发生在Firefox上 – 内存使用率或多或less是一个常数。
强制刷新页面不是一个选项。
我们将感谢任何和所有的build议。
编辑 :我们已经尝试在Chrome版本23.0.1271.97 m
和25.0.1364.2 dev-m
上运行window.gc()
和gc()
您可以获取Chrome开发工具的代码,修改它,使ProfilerAgent.collectGarbage();
(时间线面板上的“收集垃圾”button时会调用这个代码),并使用--debug-devtools-frontend
-frontend标志运行Chrome版本的DevTools。
但是,这个解决scheme是非常极端的,只有当你非常绝望的时候才能尝试。 直到那时,我build议分析你的应用程序,并检查为什么V8决定不清理垃圾(或不能清理垃圾)。 DevTools的时间线小组将帮助你解决这个问题。 开始检查这个面板底部的“收集垃圾”button是否真的做到了,如果没有的话 – 你可能会有内存泄漏(至less根据v8)。 如果是这样,请尝试使用leak-finder-for-javascript 。
[ 编辑 ]我删除了有关铬扩展的信息,事实certificate,当--js-flags="--expose-gc"
时,可以从网页代码调用gc()
。 至less在我的23.0.1271.64。
在Chrome开发者工具中,您可以从Chrome 53附近获得“时间轴”部分。您在那里有一个看起来像垃圾箱的button。 点击它,它迫使垃圾收集器运行。
我find了解决scheme。 Chrome显然漏出了DOM节点,至less在目前的版本中(现在是26.0.1410.65)
我在我的应用程序中logging了开发工具时间线,它显示了事件监听器的数量随着我的应用程序屏幕的内容而有节奏地上下移动,但是随着时间的推移,DOM节点数量稳步增加,直到标签崩溃。
我尝试了最新的Chrome Canary(28.0.1500.3),他们似乎已经解决了这个问题。 现在,DOM节点计数图遵循与事件监听器相同的节奏模式。
得到我的东西是…为什么gmail不会崩溃? 我通常会保持一个标签一次打开几个星期…