javascript - 如何检测触发 JavaScript 垃圾回收的内存分配?

标签 javascript memory-management garbage-collection google-chrome-devtools

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

出于垃圾收集的原因,至少有 30 个地方创建了临时函数/对象作为潜在候选对象。

我想知道是否有办法找到哪些函数负责分配被垃圾回收的内存,这样我就可以集中精力调优。

我记录了堆分配时间线,但它没有区分被垃圾收集的内存和仍然保留引用的内存(没有 DevTools doc 中指出的灰色条)

还记录了 Heap Allocation Profile,但运气不佳。

最佳答案

DevToolsProfiles 选项卡中,选择 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) 的一个元素,查看显示的 DistanceShallow SizeRetained Size 用于选择的列。

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

[2] :: (External strings) @n

应该列出全局变量和函数调用的地方;例如,javascrip 上面的 "t""setTimeout"。检查相应的 DistanceShallow SizeRetained Size 列以供选择。

关于javascript - 如何检测触发 JavaScript 垃圾回收的内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39429647/

相关文章:

garbage-collection - JVM 主要垃圾收集数月未运行

javascript - 动态更改 <div> 元素的大小

c# - 128 GB Ram x64 cpu 内存不足问题

ios - 使用 AFNetworking 下载多个文件时收到内存警告

c# - Visual Studio Performance Profiler "Force GC"按钮实际上在做什么?

java - 控制 JVM 大小

javascript - 具有独特字段的 mongo 结果不一致

Canvas 蛇游戏中的 Javascript 按钮

asp.net - 关于客户端 ID 的问题

objective-c - 如果在 Objective-c 中作为参数传递,引用是否仍然很弱?