如何手动触发 JavaScript 垃圾回收行为?
转载自:https://github.com/cssmagic/better-dollar/issues/3
垃圾回收,即 garbage collect,简称 “GC”。
这里的 “手动” 指有效地、显式地、可控地触发浏览器 JavaScript 引擎的垃圾回收行为,比如通过点击页面中的按钮来调用 JS 方法,或使用浏览器提供的功能。
IE
IE 实际上提供了一个未公开的 JS 方法 CollectGarbage()
。至少在 IE8 仍然存在此方法。
if (typeof window.CollectGarbage === 'function') {
CollectGarbage()
}
Opera
旧版(非 Blink 内核)的 Opera 7+ 似乎也有一个手动触发 GC 的 JS 方法。
window.opera.collect()
Firefox
有文章 提到了两种方法:
Components.utils.forceGC()
window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils)
.garbageCollect()
区别在于前者只触发 JS 引擎内的垃圾回收,而后者还可以处理 XPCOM 对象的回收。对分析网页内的垃圾回收行为来说,前者足够了。
在最新的 Firefox 中,上述方法可能已失效(无法在控制台直接调用),也可能这些方法只能在 Firefox 扩展中使用。我稍后会找低版本的 Firefox 做更多测试。
更新:在 Firefox 3.6 中也无法直接使用上述方法。
更新:有一个扩展 MemChaser 似乎允许手动触发 GC。
更新:Firefox 在 about:memory
页面中原生提供了详细的内存监控功能,但结合上述扩展使用似乎更方便一些。
Chrome
Chrome 的 DevTools 对 JavaScript 的垃圾回收和内存泄漏提供了强大的分析工具。在 DevTools 的 “Timeline” 页面可以手动点击 “CollectGarbage” 按钮来触发 GC。
详情可参见这篇文章:《搞定JavaScript内存泄漏》。