确定 GC 释放了哪些 JavaScript 对象

Posted

技术标签:

【中文标题】确定 GC 释放了哪些 JavaScript 对象【英文标题】:Determine which JavaScript objects were freed by GC 【发布时间】:2016-04-06 11:00:51 【问题描述】:

我想在任何桌面浏览器中找到一种方法来确定垃圾收集正在释放哪些 javascript 分配的对象。请注意,我不是试图跟踪“泄漏”。泄漏是没有被释放的对象。

在 Firefox 中,我正在查看的网络应用程序偶尔会出现卡顿(停止响应击键超过 1 秒);分析显示,在那段时间里,浏览器正在执行一个冗长的 GC。在前几秒钟内,添加了大量内存(以小块的形式,而不是一次全部添加)。当 GC 发生时,几乎所有的内存都会被释放。

我想弄清楚的是:这些短命的对象到底是什么?我很想知道它们的值、它们的类型,或者它们在 JS 中的分配位置。

Web 应用在所有浏览器中都表现出相同的分配模式(尽管似乎只有 Firefox 遭受了冗长的 GC);所以我很乐意使用任何浏览器(Mac 或 Windows)来调试它。

我已经知道如何使用 Chrome 的开发工具来查看泄露的对象,但正如我上面提到的,泄露不是我关心的问题。我想不出一种方法来查看哪些对象被分配然后被释放。

【问题讨论】:

【参考方案1】:

GC 只是生命周期的结束。一开始有分配。

因此,您可以使用开发工具的分配记录,而不是试图弄清楚收集了什么。

【讨论】:

你能举例说明你的意思吗?如果您在谈论“记录堆分配”按钮,我如何使用它来显示所有分配(包括最终获得 GC 的分配)? developer.chrome.com/devtools/docs/… 至少FF开发版也应该有分配堆栈记录 关于您指向 developer.chrome.com/devtools/docs/… 的链接,感谢您的建议,但这并不能解决问题。如常见问题解答中所述:“问:快照中是否包含‘死’(不可访问)对象?答:否。快照中仅包含可访问对象。此外,拍摄快照总是从执行 GC 开始。”

以上是关于确定 GC 释放了哪些 JavaScript 对象的主要内容,如果未能解决你的问题,请参考以下文章

GC详解

JVM的GC概述

深入理解java虚拟机 - 垃圾回收机制(GC)

GC判断哪些内存需要回收

垃圾回收机制(GC)

GC垃圾回收