在寻找 JavaScript 库(铆钉)中的性能问题时,我发现垃圾收集在一次运行中发生了三到四次,占用了大约 15% 的执行时间(使用 Chrome DevTools JS Profile)。
出于垃圾收集的原因,至少有 30 个地方创建了临时函数/对象作为潜在候选对象。
我想知道是否有办法找到哪些函数负责分配被垃圾回收的内存,这样我就可以集中精力调优。
我记录了堆分配时间线,但它没有区分被垃圾收集的内存和仍然保留引用的内存(没有 DevTools doc 中指出的灰色条)
还记录了 Heap Allocation Profile,但运气不佳。
最佳答案
在 DevTools
的 Profiles
选项卡中,选择 Record Heap Allocation
。包装 javascript
,它应该在对 setTimeout()
的调用中进行评估,并将持续时间设置为足够的时间,以便在函数传递给 之前单击
被调用;例如Start
>setTimeout
<!DOCTYPE html>
<html>
<head>
<script>
t = 5;
setTimeout(function() {
(function test1() {
var a = 123;
function abc() {
return a
}
abc();
}());
}, 10000)
</script>
</head>
<body></body>
</html>
当 setTimeout
被调用时,时间轴上应该出现一个蓝色条,后面可能跟着一个灰色条。单击 Ctr+E
停止记录堆配置文件。
在时间线图中选择蓝色或灰色条。在默认选项为 Summary
的下拉菜单中选择 Containment
。选择
[1] :: (GC roots) @n
其中 n
是一个数字。
通过单击 [1]::(GC roots)
左侧的三 Angular 形来展开选择。选择 [1]::(GC roots)
的一个元素,查看显示的 Distance
、Shallow Size
和 Retained Size
用于选择的列。
要检查特定功能,请滚动到
[2] :: (External strings) @n
应该列出全局变量和函数调用的地方;例如,javascrip
上面的 "t"
和 "setTimeout"
。检查相应的 Distance
、Shallow Size
和 Retained Size
列以供选择。
关于javascript - 如何检测触发 JavaScript 垃圾回收的内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39429647/