15

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

4

4 回答 4

9

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

现在单击第二个快照。

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

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

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

于 2013-08-21T17:49:29.373 回答
6

对于较新的 Chrome 版本,有一个新工具可以方便地完成此类任务:

“记录堆分配”分析类型。常规的“Heap SnapShot”比较工具(如 Rafał Łużyński 的回答中所述)无法为您提供此类信息,因为每次拍摄堆快照时,都会执行一次 GC 运行,因此 GC 对象永远不会成为快照的一部分。但是,使用“记录堆分配”工具会不断记录所有分配(这就是为什么在记录时它可能会大大减慢您的应用程序的速度)。如果您遇到频繁的 GC 运行,此工具可以帮助您识别代码中分配大量内存的位置。结合 Heap SnapShot 比较,您将看到大多数时候在两个快照之间分配的内存比您从比较中看到的要多得多。

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

于 2013-08-27T07:08:25.370 回答
3

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

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

于 2012-09-22T21:31:57.223 回答
3

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

特别是遏制视图

包含视图本质上是应用程序对象结构的“鸟瞰图”。它允许您查看函数闭包内部,观察共同构成 JavaScript 对象的 VM 内部对象,并在非常低的级别了解您的应用程序使用了多少内存。

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

DOMWindow 对象——这些对象被认为是 JavaScript 代码的“全局”对象;GC 根——VM 的垃圾收集器使用的实际 GC 根;原生对象——被“推送”到 JavaScript 虚拟机中以实现自动化的浏览器对象,例如 DOM 节点、CSS 规则(有关详细信息,请参阅下一节。)以下是 Containment 视图的示例:

在此处输入图像描述

于 2013-08-27T10:47:29.043 回答