【问题标题】:Can I get the GC'd memory from dev tools?我可以从开发工具中获取 GC 的内存吗?
【发布时间】:2015-02-21 16:19:38
【问题描述】:
我有一个正在调试的大型应用程序。我注意到一个锯齿状的内存模式,表明正在进行频繁的 GC。
为了调试它,我试图找到正在被 GC 处理的内存的内容。这可以在带有开发工具的 chrome 中实现吗?我知道我可以拍摄堆快照,但我如何保证这会在 GC 之前和之后立即发生?我知道我可以从代码中触发堆快照,但同样的问题。
【问题讨论】:
标签:
javascript
memory-leaks
garbage-collection
google-chrome-devtools
【解决方案1】:
DevTools 中尚不提供对垃圾收集的深入了解。不过,我前段时间有requested this feature。您可以“加星标”表示您也想拥有它。
至于快照,您将无法将它们用于您的目的。在制作每个快照之前,都会收集所有垃圾。
快照中是否包含“死”(无法访问)对象?
没有。快照中仅包含可访问的对象。此外,拍摄快照总是从进行 GC 开始。
source
您最好的方法是记录堆分配(“配置文件”>“记录堆分配”)并使用内存快照来了解应用程序正在创建哪些对象。有了这些知识,您可以尝试识别寿命短的物体(导致锯齿图案)。
顺便说一句,如果你使用requestAnimationFrame,你应该知道它本身就是causing saw tooth pattern。
【解决方案2】:
使用记录堆分配配置文件类型,您可以获得有关已分配对象的信息。
您需要在 DevTools 设置中启用“记录堆分配堆栈跟踪”选项。
见截图。
之后,您需要记录“记录堆分配”快照类型。
记录过程可能会显着减慢页面速度,因为 DevTools 每次页面分配对象时都会扫描 js 堆栈。结果,您将获得包含有关分配信息的快照。在许多情况下,DevTools 可以检测对象的类名。见截图。
在快照中您需要选择分配视图。
我认为网格中的信息可以帮助您解决问题。
在屏幕截图中,您可以看到一个类有 41k 分配,但其中只有 12k 仍然存在。所以 29k 个对象是垃圾。即使您没有看到对象的名称,您也可以跳转到分配对象的源。