【发布时间】:2013-01-28 15:55:58
【问题描述】:
即使没有处理或存储返回的数据,也会发生这种情况。
这里是上下文:
HTML 包含
<table border="0" cellpadding="2" cellspacing="0" class="formPanel" style="width:100%">
<tbody><tr>
<td>
<span style="vertical-align:middle;">
<span>Date:
<input id="datePicker" name="DatePicker" maxlength="10" value="20130128"/>
</span>
<input id="go-btn" style="width:80px;" type="button" value="Go"/>
</span>
</td>
</tr>
</tbody></table>
而 JavaScript 是
$(function(){
// Extracted the previously anonymous function to reduce memory used to store "compiled code"
function processData(data) {
//process data
}
// Extracted the previously anonymous function to reduce memory used to store "compiled code"
function clickHandler() {
var keys = ['googlechrome','firefox','opera', 'webkit', 'ie'];
for(var i = 0; i < keys.length; i++) {
/* Previously a method call
*/
var date = $("#datePicker").val().replace(/-/g, ''),
// A local URL, That returns a max of 5MB.
url = "/get_usage?date="+date;
url += '&user_agent=' + keys[i];
url += "&min_count=250";
$.getJSON(url, processData);
}
}
$("#go-btn").click(clickHandler);
});
一键接收到的数据实际大小约为 10MB,但是当我检查 Chrome 的任务管理器中的内存列时超过 30MB,并且一段时间后它收集了大约 4MB 的垃圾(不知道这是否无关)。
我怀疑 jQuery 的 getJSON 方法,因为在删除它并将数组大小增加十倍时,整体内存并没有太大差异。
【问题讨论】:
-
您的测试中的
processData是否像上面那样为空?你用的是什么版本的jQuery? -
分配的内存不一定只是您的数据所需的内存。执行代码所需的其他资源也可以在那时按需加载。所以为了确保你真的有泄漏,你应该执行一次代码,然后查看内存,然后再次(或多次)执行相同的代码。另一件要提的是,chrome 确实有保持活动的请求。在服务器断开它们之前保持活动状态。
-
我看到一个错误报告 #6388 已在 jQuery 1.8 中修复,但这是针对 JSONP 的。如果您使用的是旧版本,我建议您尝试使用 migrate 插件升级到 1.9(您将能够慢慢更新任何已弃用的函数用法)。
-
谢谢@ErikNedwidek 我会尝试升级到1.9。如果这不能解决这个问题,我会更新问题。
-
@t.niese 正如我在问题中提到的,在删除包含 $.getJSON 方法的行时,我没有内存泄漏。我猜这是 Erik 提到的 JSONP 调用的问题。感谢您的回复。
标签: jquery debugging memory-leaks httprequest