如何检测在JavaScript中触发垃圾收集的内存分配
How to detect the memory allocations that are triggering garbage collection in JavaScript?
在寻找JavaScript库(铆钉)的性能问题时,我发现垃圾收集在一次运行中发生三到四次,占用约15%的执行时间(使用Chrome DevTools JS Profile)。
由于垃圾收集的原因,至少有30个地方创建了临时函数/对象。
我想知道是否有一种方法可以找到哪些函数负责被垃圾收集的内存分配,这样我就可以集中我的性能调优。
我记录了堆分配时间线,但它没有区分被垃圾收集的内存,并且仍然保持引用(没有灰色条在DevTools文档中指向)
还记录了堆分配配置文件。
At Profiles
tab At DevTools
select Record Heap Allocation
。包裹javascript
,它应该在setTimeout()
的调用中评估,持续时间设置为在调用传递给setTimeout
的函数之前点击Start
的足够时间;例如
<!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
停止记录堆配置文件。
在时间图上选择蓝色或灰色条。在下拉菜单中选择Containment
,默认选项为Summary
。选择
[1] :: (GC roots) @n
其中n
为数字。
点击[1] :: (GC roots)
左边的三角形展开选区。选择[1] :: (GC roots)
中的一个元素,查看显示的Distance
、Shallow Size
和Retained Size
列。
查看特定功能,滚动到
[2] :: (External strings) @n
指向应该列出全局变量和函数调用的位置;例如,"t"
和"setTimeout"
来自javascrip
之上。检查对应的Distance
、Shallow Size
、Retained Size
列的选择
- Javascript内存分配
- Javascript是否为具有未定义值的变量分配32位内存
- 使用模块模式时分配了多少内存
- JavaScript 中的堆和本机内存分配:如何管理
- 分配更多内存 Cucumber-js
- 节点为数组中的空值分配多少内存
- 事件处理程序分配和内存泄漏
- JSON 树和内存分配
- JavaScript 类型的内存分配
- 为阵列分配内存
- 是否可以加载图像,在内存中缩放它并将其分配为背景图像的 uri
- Javascript 类、编译器性能和新 Klass() 上的内存分配
- 画布路径内存分配
- 内存分配和DOM元素
- Chrome在使用单页应用程序时增加系统内存分配
- 致命错误:CALL_AND_RETRY_2分配失败-进程在预处理我的js字段时内存不足
- 删除缓存文件并以编程方式释放为其分配的内存
- 如何检测在JavaScript中触发垃圾收集的内存分配
- 是否可以在不分配内存的情况下存储值
- 如何在for(prop in obj)循环中分配内存,最好的方法是什么