【问题标题】:Why is memory usage not correctly updated?为什么没有正确更新内存使用情况?
【发布时间】:2014-08-19 17:02:48
【问题描述】:

警告:此代码最终会耗尽浏览器标签页的内存并使标签页崩溃。

在下面的fiddle中,我设置了一个进程,它会泄漏大量内存并不断报告正在使用的内存量。我正在使用 performance.memory API,它似乎只在 chrome 上实现。问题是报告的数量从未改变,尽管内存使用量正在迅速增加。相反,我希望顶部的数字会不断增加。

这里是javascript代码:

(function() {

var x = [];

function createSomeNodes() {
    var div,
        i = 100,
        frag = document.createDocumentFragment();
    for (;i > 0; i--) {
        div = document.createElement("div");
        div.appendChild(document.createTextNode(i + " - "+ new Date().toTimeString()));
        frag.appendChild(div);
    }
    document.getElementById("debug").appendChild(frag);
}

function clear() { document.getElementById('stats').innerHTML = ''; }

function show(stat) { 
  var div = document.getElementById('stats');
  div.appendChild(document.createTextNode(stat));
  div.appendChild(document.createElement("div"));
 }

var start = Date.now() + 2 * 1000;

function grow() {
    x.push(new Array(1000000).join('x'));
    createSomeNodes();
    setTimeout(grow,40);

if (Date.now() < start) { return; }

              (function() {
                clear();
                var pm = window.performance && window.performance.memory;
                if (!pm) {
show("no performance.memory api");
                  return;
                }
                var lim = pm.jsHeapSizeLimit, // Memory the JavaScript heap is limited to
                    // Memory allocated on the JavaScript heap (includes free space)
                    total = pm.totalJSHeapSize,
                    used = pm.usedJSHeapSize; // Memory currently being used 
                show("Crash Index (% of Heap Limit Allocated): " + Math.round(total / lim * 100));
                show("% of Allocated Memory Used: " + Math.round(used / total * 100));
              })();

}


    setTimeout(grow,1000);
})()

如果我将变量 start 设置为更高的数字,我会看到更高的 initial 值,我称之为“崩溃指数”,但在首次显示后,即使是这个值不增加。

【问题讨论】:

标签: javascript google-chrome memory


【解决方案1】:

出于安全原因,默认情况下,Google Chrome 不会通过performance.memory 提供准确信息。

因此,您必须通过带有此标志 --enable-precise-memory-info 的终端打开浏览器,以允许 Google Chrome 显示有关您计算机的准确信息。

【讨论】:

【解决方案2】:

出于安全原因,Google Chrome 中的内存采样限制为每 20 分钟一次。在 Chrome 68+ 中,对于从与网页相同的来源 (eTLD+1) 提供的脚本,该限制已降低到每 50 毫秒一次。这意味着您可能不再需要--enable-precise-memory-info

https://chromium.googlesource.com/chromium/src/+/7c7847f69de403f6c798dfccba10812039a60480

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2019-03-07
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多