如何解读Chrome的内存分析结果?

时间:2015-06-28 12:19:15

标签: javascript jquery memory-management garbage-collection

我最近一直在阅读Javascript内存管理,并决定分析我最近写的这个应用程序的一部分。它使jQuery AJAX调用每5秒到另一个PHP页面,实质上是监视数据库的变化。任何时候都没有发生DOM变化。

无论如何,我在Chrome的devtools上运行了Profiler和Timeline的东西,如果我有可能的内存泄漏,我不太清楚如何解释:

时间轴:

我没有在任何时候触发手动垃圾收集(通过工具栏中的按钮): Timeline profile

堆分配概要分析器:

将此时间缩短一段时间,5.0秒标记到1.2分钟标记之间的部分在“构造函数”面板中没有任何内容: Heap allocation profile

如果我没错,第一张图片(接近240000ms标记)的下降是浏览器触发的垃圾收集事件。

我的问题是,为什么在第二张图片中我在过去的时间内没有任何对象(从5.0s到1.2m标记),而JS堆大小每5秒继续增长

我想这并不表示内存泄漏,但是由于我已经有效地解除了内存中变量和对象的引用,因此堆大小继续增长,但是我的脚本每5秒继续创建一个新变量,并且所有解除引用的东西只会在几分钟后收集垃圾?

更重要的是,这是处理内存使用的正确方法?意思是,是否足以正确地取消引用您的临时变量,或者我是否也必须考虑自己触发垃圾收集?

P.S。最后一个问题可能过于宽泛,我只是在寻找关于这个主题的最佳实践,作为主要问题的附加内容,即确认我的结论为什么堆大小继续增长是正确的,如上所述

1 个答案:

答案 0 :(得分:1)

不要查看图表,使用快照(例如example)。

检测泄漏需要做的是:

  1. 制作初始堆快照
  2. 等一下或做一些应该泄漏内存的操作
  3. 制作第二个堆快照
  4. 使用两个快照之间的比较视图来查看是否剩下第一个快照中的任何元素。
  5. 在这个视图中有对象很好,除非它包含一些不再被使用的对象。