如何检测在JavaScript中触发垃圾收集的内存分配?

bli*_*lum 5 javascript garbage-collection memory-management google-chrome-devtools

在JavaScript库(铆钉)中查找性能问题时,我发现垃圾收集在运行中发生了三到四次,占用了大约15%的执行时间(使用Chrome DevTools JS Profile).

由于垃圾收集的原因,至少有30个临时功能/对象被创建为潜在候选者的地方.

我想知道是否有办法找到哪些函数负责分配被垃圾收集的内存,所以我可以集中我的性能调优.

我记录了Heap Allocation TimeLine,但它没有区分垃圾收集的内存和仍然保存引用的内存(DevTools doc中没有指向灰色栏)

还记录堆分配配置文件没有运气.

gue*_*314 1

Profiles选项卡处DevTools选择Record Heap Allocation. Wrapjavascript应该在调用中进行评估,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>
Run Code Online (Sandbox Code Playgroud)

setTimeout被称为蓝色条时,时间轴上可能会出现一个灰色条。点击Ctr+E可停止记录堆配置文件。

在时间线图表中选择蓝色或灰色条。在下拉菜单中选择Containment,默认选项为Summary。选择

[1] :: (GC roots) @n
Run Code Online (Sandbox Code Playgroud)

在哪里n是一个数字。

单击 左侧的三角形来展开选择[1] :: (GC roots)。选择 的一个元素[1] :: (GC roots),查看显示的DistanceShallow SizeRetained Size列以进行选择。

要检查特定功能,请滚动至

[2] :: (External strings) @n
Run Code Online (Sandbox Code Playgroud)

应该列出全局变量和函数调用的位置;即,"t""setTimeout"上面javascrip。检查相应的DistanceShallow Size、 和Retained Size列进行选择。