我最近一直在阅读Javascript内存管理,并决定分析我最近写的这个应用程序的一部分。它使jQuery AJAX调用每5秒到另一个PHP页面,实质上是监视数据库的变化。任何时候都没有发生DOM变化。
无论如何,我在Chrome的devtools上运行了Profiler和Timeline的东西,如果我有可能的内存泄漏,我不太清楚如何解释:
时间轴:
我没有在任何时候触发手动垃圾收集(通过工具栏中的按钮):
堆分配概要分析器:
将此时间缩短一段时间,5.0秒标记到1.2分钟标记之间的部分在“构造函数”面板中没有任何内容:
如果我没错,第一张图片(接近240000ms标记)的下降是浏览器触发的垃圾收集事件。
我的问题是,为什么在第二张图片中我在过去的时间内没有任何对象(从5.0s到1.2m标记),而JS堆大小每5秒继续增长?
我想这并不表示内存泄漏,但是由于我已经有效地解除了内存中变量和对象的引用,因此堆大小继续增长,但是我的脚本每5秒继续创建一个新变量,并且所有解除引用的东西只会在几分钟后收集垃圾?
更重要的是,这是处理内存使用的正确方法?意思是,是否足以正确地取消引用您的临时变量,或者我是否也必须考虑自己触发垃圾收集?
P.S。最后一个问题可能过于宽泛,我只是在寻找关于这个主题的最佳实践,作为主要问题的附加内容,即确认我的结论为什么堆大小继续增长是正确的,如上所述的
答案 0 :(得分:1)
不要查看图表,使用快照(例如example)。
检测泄漏需要做的是:
在这个视图中有对象很好,除非它包含一些不再被使用的对象。