【发布时间】: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 值,我称之为“崩溃指数”,但在首次显示后,即使是这个值不增加。
【问题讨论】:
-
我为您的代码做了一个带有“停止”按钮的版本,以防止标签崩溃。现在我要检查发生了什么。 jsfiddle.net/x3d48ja0/7
-
检查这个。 peter.sh/experiments/chromium-command-line-switches 搜索 performance.memory 这应该可以工作
-
确实! --启用精确内存信息;添加此答案,我会接受。
标签: javascript google-chrome memory