Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何手动触发 JavaScript 垃圾回收行为? #3

Open
cssmagic opened this issue Apr 15, 2015 · 2 comments
Open

如何手动触发 JavaScript 垃圾回收行为? #3

cssmagic opened this issue Apr 15, 2015 · 2 comments
Labels

Comments

@cssmagic
Copy link
Owner

如何手动触发 JavaScript 垃圾回收行为?

垃圾回收,即 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内存泄漏》


小结

在推测 JavaScript 引擎的 GC 行为时,有时只能做一些黑盒测试(比如强制浏览器进行 GC 并观察前后的内存占用对比),此时就会用到上述方法了。

@gitHber
Copy link

gitHber commented Jul 9, 2019

为啥chrome里面memory点collect garbage不能回收?多次快照内存没变化

@xgqfrms
Copy link

xgqfrms commented Jul 2, 2020

not really manually GC?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants