shi*_*ino 14 javascript garbage-collection google-chrome
我有重要的垃圾收集暂停.在尝试解决问题之前,我想确定最负责此集合的对象.我已经查看了Chrome上的堆快照,但是(如果我错了,请纠正我)我似乎无法找到正在收集的内容的任何指示,只有占用最多内存的内容.有没有办法根据经验回答这个问题,还是仅限于有根据的猜测?
在chrome配置文件中需要两个堆快照,一个在执行您要检查的操作之前,另一个在之后.
现在单击第二个快照.
在底部栏上,您将看到带有"摘要"选项的选择框.将其更改为"比较".
然后在它旁边的选择框中选择要比较的快照(它应该自动选择snapshot1).
根据结果,您将获得所需数据表,即."新建"和"已删除"对象.
对于较新的Chrome版本,有一种新工具可用于此类任务:
"记录堆分配"概要分析类型.常规的"Heap SnapShot"比较工具(如RafałŁużyński答案中所述)无法提供这种信息,因为每次执行堆快照时,都会执行GC运行,因此GCed对象永远不会成为快照的一部分.然而,通过"记录堆分配"工具,不断记录所有分配(这就是为什么它在录制时可能会大大减慢你的应用程序的速度).如果您经常进行GC运行,此工具可以帮助您识别代码中分配了大量内存的位置.结合Heap SnapShot比较,您将看到大多数时间在两个快照之间分配的内存比从比较中看到的要多得多.在极端情况下,比较根本不会产生任何差异,而分配工具将向您显示大量分配的内存(显然必须在此期间进行垃圾回收).
不幸的是该工具的当前版本不告诉你哪里的分配发生了,但它会告诉你什么已被分配以及它是如何被保留在分配的时间.然而,从数据(可能还有构造函数)中,您将能够识别对象,从而识别它们的分配位置.
如果您试图在几个可能的罪魁祸首之间进行选择,您可以修改对象定义以将其自身附加到全局范围(如文档或其他内容下的列表)。那么这将阻止它们被收集。这可能会使程序更快(它们没有被回收)或更慢(因为它们每次都会被标记和扫描构建并检查)。因此,如果您看到性能发生变化,则可能已经发现了问题。
一种替代方法是查看每种类型正在创建多少个对象(在构造函数中设置一个计数器)。如果它们被大量收集,它们的创建也会同样频繁。