我在使用 Google Chrome Dev Tools:Heap Snapshots 调试我的应用程序是否存在内存泄漏时,发现了一些奇怪的事情。
我发出了一个 AJAX 请求来获取一个大型的 JSON 博客,显然原始响应文本停留在内存中,导致我的应用程序发生内存泄漏。
在 $.ajax 中似乎不太可能存在巨大的内存泄漏,但我希望能解释为什么会这样......如果我在 vanilla JS 中进行相同的实验,则不会显示泄漏.
1) 纯 JavaScript XHR
- 来源:http://jsfiddle.net/HZmT5/2/ (使用
XMLHttpRequest
) - 输出:http://fiddle.jshell.net/HZmT5/2/show/light/
- 没有显示泄漏
2) 使用 $.getJSON
- 来源:http://jsfiddle.net/JmA8v/1/ (使用
$.getJSON
) - 输出:http://fiddle.jshell.net/JmA8v/1/show/light/ (显示泄漏)
- 泄漏显示,见屏幕截图:
屏幕截图:XHR 请求的整个 HTTP 响应都停留在内存中。 “快照 1”是在按下按钮之前。 “快照2”在之后。请注意下面的屏幕截图,它是堆前后的比较。
在纯 JS 版本中没有重现相同的行为。
(当然,HTMLDivElement 仍将保留在堆中,因为它在 DOM 中,但似乎没有必要将完整的 JSON 对象保留在堆中)
最佳答案
这video证明实际上没有内存泄漏。 jQuery 获取新版本的字符串,v8 释放旧版本。出现这种行为的原因是 V8 引擎使用许多不同的优化技巧,并且可能会在其内部结构和生成的代码中保留对对象的引用。
视频中的蓝色条是探查器在 v8 堆中发现新对象/字符串的时刻。当 v8 将这些对象作为垃圾收集时,条形图变为灰色。
关于javascript - jQuery 的响应文本的 AJAX 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23572149/