Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确定垃圾收集器正在收集哪些对象?_Javascript_Google Chrome_Garbage Collection - Fatal编程技术网

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

Javascript 如何确定垃圾收集器正在收集哪些对象?,javascript,google-chrome,garbage-collection,Javascript,Google Chrome,Garbage Collection,我有明显的垃圾收集暂停。在我试图解决这个问题之前,我想找出对这个集合最负责的对象。我已经查看了Chrome上的堆快照,但是(如果我错了,请纠正我),我似乎找不到任何关于正在收集的内容的指标,只有占用最多内存的内容。有没有一种方法可以根据经验来回答这个问题,或者我仅限于有根据的猜测?如果您试图在几个可能的罪魁祸首中进行选择,您可以修改对象定义以将其自身附加到全局范围(如文档或其他内容下的列表)。 那么这将阻止它们被收集。这可能会使程序更快(它们没有被回收)或更慢(因为它们每次都会建立并通过标记和扫

我有明显的垃圾收集暂停。在我试图解决这个问题之前,我想找出对这个集合最负责的对象。我已经查看了Chrome上的堆快照,但是(如果我错了,请纠正我),我似乎找不到任何关于正在收集的内容的指标,只有占用最多内存的内容。有没有一种方法可以根据经验来回答这个问题,或者我仅限于有根据的猜测?

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


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

在chrome配置文件中,会拍摄两个堆快照,一个在执行要检查的操作之前,一个在执行之后

现在单击第二个快照

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

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


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

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

“记录堆分配”分析类型。常规的“堆快照”比较工具(如Rafałużyński回答中所述)无法提供此类信息,因为每次拍摄堆快照时,都会执行GC运行,因此GCed对象从来不是快照的一部分。 然而,随着“记录堆分配”工具的不断使用,所有分配都会被记录下来(这就是为什么它在记录时可能会大大降低应用程序的速度)。如果您遇到频繁的GC运行,此工具可以帮助您确定代码中分配大量内存的位置。 结合堆快照比较,您将看到,在大多数情况下,在两个快照之间分配的内存比您从比较中看到的要多得多。在极端情况下,比较不会产生任何差异,而分配工具将显示大量已分配内存(显然在此期间必须进行垃圾收集)

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

看看

尤其是遏制观

安全壳视图本质上是您的“鸟瞰视图” 应用程序的对象结构。它允许您查看函数的内部 闭包,以观察共同构成您的 JavaScript对象,并了解应用程序的内存大小 在非常低的水平上使用

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

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


您如何确定暂停是由垃圾收集引起的?您读过这篇文章吗@铅笔有两种方式-它们与Chrome中内存时间轴上的内存下降一致,当我强制代码大量迭代以导致不断暂停时,垃圾收集(到目前为止)是我评测结果中最耗时的部分。@yunzen不,我没有,谢谢。我可能错过了什么,但我不确定这对我有什么帮助。我相信我没有发生泄漏,因为我的内存使用没有随着时间的推移而增长。查看Google的web跟踪框架,据我所知,可以垃圾收集的对象不会出现在该视图中,因为在拍摄快照之前,GC运行已经完成。因为OP想知道什么对象是GCD,这并没有真正的帮助,或者是真的吗?这听起来很好,但似乎不起作用。GC任务正在清除大约2MB的数据,但是当我使用记录堆分配工具时。它只显示少量(KB)的数据。