【问题标题】:Memory leak when repeatedly loading large JSON data重复加载大型 JSON 数据时的内存泄漏
【发布时间】: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


【解决方案1】:

正如我在问题中提到的,在删除包含 $.getJSON 方法的行时,我没有内存泄漏。我猜这是 Erik 提到的 JSONP 调用的问题。感谢回复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多