我可以从开发工具中获取GC内存吗?

时间:2014-12-23 13:54:13

标签: javascript memory-leaks garbage-collection google-chrome-devtools

我有一个大型应用程序,我正在调试。我注意到一个锯齿形记忆模式,表明经常发生GC。

为了调试这个,我试图找到正在进行GC的内存的内容。使用开发工具可以在Chrome中实现这一点吗?我知道我可以拍摄堆快照,但我如何保证在GC之前和之后立即发生这种情况?我知道我可以从代码中触发堆快照,但同样的问题。

2 个答案:

答案 0 :(得分:1)

DevTools中尚未提供对垃圾收集的深入了解。不久前我有requested this feature。你可以“明星”#34;表示你也想拥有它。


对于快照,您无法将它们用于您的目的。在制作每个快照之前,会收集所有垃圾。

  

"死了"快照中包含(无法访问)对象?

     

没有。快照中仅包含可到达的对象。此外,拍摄快照始终从执行GC开始。

source


最好的方法是记录堆分配("配置文件">"记录堆分配")并使用内存快照来了解应用程序正在创建哪些对象。有了这些知识,你可以尝试识别短暂存在的物体(导致锯齿模式)。

顺便说一句,如果你使用requestAnimationFrame,你应该知道它本身就是causing saw tooth pattern

答案 1 :(得分:1)

使用记录堆分配配置文件类型,您可以获取有关已分配对象的信息。

您需要在DevTools设置中启用“记录堆分配堆栈跟踪”选项。 见截图。

Settings screenshot

之后,您需要记录“记录堆分配”快照类型。 记录过程可能会显着减慢页面速度,因为每次页面分配对象时,DevTools都会扫描js堆栈。因此,您将获得包含有关分配信息的快照。在许多情况下,DevTools可以检测对象的类名。见截图。

enter image description here

在快照中,您需要选择分配视图。

我认为网格中的信息可以帮助您解决问题。 在屏幕截图中,您可以看到一个类有41k的分配,但只有12k仍然存在。所以29k物体就是垃圾。即使您没有看到对象的名称,您也可以跳转到分配对象的源。