Chrome JavaScript内存分析器中的系统对象是什么?

33

我正在使用Chrome开发工具对JavaScript应用程序进行性能分析。

我看到唯一增长的内存区域是系统对象总数。

我想知道如何理解是什么导致了这种行为,因为工具中没有详细信息显示哪些系统对象泄漏了。

我已经查看了应用程序分配情况,但随着时间的推移,它并没有很大变化...... 当我使用时间轴功能时,堆的大小会增长超过500MB。

初始快照"

多小时使用后的快照

使用时间轴工具后的快照


你在问题中提到的堆统计参数不是"System Objects Total"。"System Objects"和"Total"是不同的。 - Abhijeet
寻找堆增长原因最简单的方法是在比较视图中比较两个快照。这可能是DOM节点,虽然它们不再是DOM树的一部分,但仍然被代码引用。 - a better oliver
4
之前它被称作V8堆,技术上是距离大于等于100000000的对象。请参阅术语。我认为,系统堆本身可能会因为调试器而增长。在Chrome的Shift-Esc任务管理器或chrome://tracing/中不使用它时,请比较内存使用情况。 - wOxxOm
你可能把那个作为答案提交就可以了,会令人满意的。 - TylerY86
@SergeyDryganets 只是一种直觉,但如果你正在对某些东西进行分析...那么随着时间推移建立的分析数据趋势必须要被存储在某个地方。猜猜它被存储在哪里?我不知道。可能就在那里。;) - TylerY86
1个回答

11
根据Chromium中JSHeapSnapshot.js的实现,如wOxxOm所述的评论,对于给定节点到100000000的距离进行比较(distances[ordinal] >= WebInspector.HeapSnapshotCommon.baseSystemDistance,其中WebInspector.HeapSnapshotCommon.baseSystemDistance = 100000000),如果通过,则将大小累加到饼图的系统段中。
最后修改此值的commit提到:

当前,如果用户对象同时由系统空间对象(例如调试器)和另一个用户对象保留,则系统对象可能会在保留者树中更早地显示。 如果其距离小于其他保留用户对象的距离,则会发生这种情况。

该补丁将系统空间对象到用户对象的链接视为优先级较低,因此这些链接显示在保留器树的底部。
这表明JavaScript堆上的系统空间对象被调试器和其他浏览器内部(V8、WebKit等)使用。它们不受脚本分配的堆对象的直接控制。
wOxxOm还提到名称曾经是V8堆。也就是说,V8分配的对象超出了执行脚本的范围。
非常可能运行分析并拍摄快照也会在该类堆对象中执行分配,从而导致随着时间的推移构建系统分配的模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接