如何确定垃圾收集器正在收集哪些对象?

时间:2012-09-22 21:12:49

标签: javascript google-chrome garbage-collection

我有重要的垃圾收集暂停。在尝试解决问题之前,我想确定最负责此集合的对象。我已经查看了Chrome上的堆快照,但是(如果我错了,请纠正我)我似乎无法找到任何正在收集的内容的指标,只是占用了大部分内存。有没有办法根据经验回答这个问题,还是仅限于有根据的猜测?

4 个答案:

答案 0 :(得分:9)

在chrome配置文件中需要两个堆快照,一个在执行您要检查的操作之前,另一个在之后。

现在点击第二张快照。

在底栏上,您会看到带有“摘要”选项的选择框。将其更改为“比较”。

然后在它旁边的选择框中选择要比较的快照(它应该自动选择snapshot1)。

作为结果,您将获得所需数据的表格,即。 “新”和“删除”对象。

答案 1 :(得分:6)

对于较新的Chrome版本,有一种新工具可用于此类任务:

“记录堆分配”概要分析类型。常规的“Heap SnapShot”比较工具(如RafałŁużyński答案中所述)无法提供这种信息,因为每次执行堆快照时,都会执行GC运行,因此GCed对象永远不会成为快照的一部分。 但是,通过“记录堆分配”工具,不断记录所有分配(这就是为什么它在录制时可能会大大减慢您的应用程序的速度)。如果您经常进行GC运行,此工具可以帮助您识别代码中分配了大量内存的位置。 结合Heap SnapShot比较,您将看到大多数时间在两个快照之间分配的内存比从比较中看到的要多得多。在极端情况下,比较根本不会产生任何差异,而分配工具会向您显示大量分配的内存(显然必须在此期间进行垃圾回收)。

不幸的是,该工具的当前版本没有向您显示分配发生的 ,但它会显示已分配的以及如何保留分配的时间。然而,从数据(可能还有构造函数)中,您将能够识别对象,从而识别它们的分配位置。

答案 2 :(得分:3)

如果您尝试在几个可能的罪魁祸首中进行选择,您可以修改对象定义以将自己附加到全局范围(作为文档下的列表或其他内容)。 然后这将阻止它们被收集。这可能使程序更快(它们不被回收)或更慢(因为它们建立并且每次都通过标记和扫描进行检查)。因此,如果您发现性能发生了变化,您可能会发现问题。

另一种方法是查看每种类型创建的对象数量(在构造函数中设置计数器)。如果它们被收集了很多,它们也会被频繁地创建。

答案 3 :(得分:3)

查看https://developers.google.com/chrome-developer-tools/docs/heap-profiling

特别是遏制视图

  

遏制视图本质上是你的“鸟瞰图”   应用程序的对象结构。它允许你偷看内部功能   闭包,观察一起组成你的VM内部对象   JavaScript对象,并了解您的应用程序有多少内存   使用率非常低。

     

该视图提供了几个切入点:

     

DOMWindow对象 - 这些对象被视为“全局”对象   用于JavaScript代码; GC根 - VM垃圾使用的实际GC根   集电极;本机对象 - 被“推入”内部的浏览器对象   允许自动化的JavaScript虚拟机,例如, DOM节点,   CSS规则(有关更多详细信息,请参阅下一节。)以下是   包含视图的示例:

enter image description here