【问题标题】:Interpretation of memory usage in chrome task managerchrome任务管理器中内存使用情况解读
【发布时间】:2014-07-15 11:19:19
【问题描述】:

我从一个大型 java 脚本应用程序中的内存泄漏调查开始,该应用程序作为一个小部件在基于 webkit 和 sfx(java 脚本核心引擎)的浏览器中运行。过了一会儿,我发现记忆的来源随着时间的推移而增加。恰好是$.ajax(..)

好的,我想,让我们尝试不同版本的jquery 或直接使用XMLHttpRequest - 结果相同。然后我在谷歌浏览器上检查它并感到惊讶,因为堆分析器既没有显示 js 对象数量的增加也没有显示堆大小的增加,而 chrome 任务管理器显示内存和私有内存的增加。我测试的代码如下:

var Main = {};
var xhr = new XMLHttpRequest();

function makeRequest() {
    xhr.timeout = 2000;
    xhr.ontimeout = function() {
        xhr.abort();
    }
    xhr.onreadystatechange = function() {
        if (xhr.readyState != 4) return;
    };

    xhr.open("POST", "", true); //async post request to local server
    xhr.send("{}");
}

Main.onLoad = function()
{
    setInterval(function() { makeRequest(); }, 3000);
}

那么,这种行为可以吗?这不是原生内存泄漏的迹象吗?

附:我在 windows 7 企业版上使用 chrome 版本 35.0.1916.153。

【问题讨论】:

    标签: javascript google-chrome-devtools


    【解决方案1】:

    According to the spec,xhr 不会自动 GC。

    4.2 垃圾回收

    如果 XMLHttpRequest 对象的状态为 OPENED 并且设置了 send() 标志,它的状态是 HEADERS_RECEIVED,或者 其状态为 LOADING 且已注册一个或多个事件侦听器 其类型是 readystatechange、progress、abort、error、load、 超时,加载结束。

    如果一个 XMLHttpRequest 对象在其连接时被垃圾回收 仍然打开,用户代理必须终止请求。

    This article 对这个问题和类似问题有很好的解释。通常的解决方法是在xhr.send() 之后通过xhr = null 清除回调中对主机对象的引用。我说通常修复是因为您没有分配更多 xhr 对象或对本示例中的结果做任何事情。正如你所说,堆没有改变,看起来你没有泄漏。

    单独使用 chrome 任务管理器无法告诉您是否有泄漏。我发现this article 是关于如何使用 chrome 的 devtools 诊断内存泄漏的有用教程。您将需要手动触发 GC 并验证内存不会持续增长。如果您发现确实存在内存泄漏,您可以使用 devtools 找出哪些对象不是保留路径的一部分,但仍在内存中(有关如何执行此操作的更多信息,请参阅该文章)。

    【讨论】:

    • 感谢您的回复。实际上,我从您分享的链接中学到了一些新员工。我觉得我没有提供足够的关于我的实验的信息。我在时间线选项卡上使用了堆分配分析器和计数器统计信息(我定期运行 GC)。一切都表明没有内存泄漏。但是tab进程消耗了越来越多的私有内存。我在 Firefox 上检查了它。进程内存未超过固定级别。因此,Firefox 似乎没有这样的问题。在 Safari 上观察到与 Chrome 相同的行为。
    • P.S.我在与我的问题相关的铬项目上找到了issue。似乎还没有修复(实际上我不知道)。不过,bugzilla 上类似的issue 已经修复
    • 在您链接的 chromium 问题中,它提到 jquery 通过清除通过 xhr.onreadystatechange = nullxhr.ontimeout = null 附加到 xhr 的处理程序来修复内存泄漏。
    • 是的,我试过 jquery-2.1.1 的 ajax。结果是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2017-08-16
    • 2015-02-27
    • 2014-08-26
    相关资源
    最近更新 更多