编辑:似乎新的Firefox开发人员版具有我用于分析内存分配的工具,因此我不需要此问题的答案,但是我仍然很好奇Chrome幕后发生了什么。 / p>
为什么下面的代码记录类似
的内容mdiff (10) [-91272, -824, 56, 56, 56, 528, 472, 208, 208, 208]
不是
mdiff (10) [56, 56, 56, 56, 56, 208, 208, 208, 208, 208]
在V8上(Chrome(或经过调整脚本的Node))?
我怀疑在第一个window.gc()中没有立即调用Major GC。从JS准确测量内存分配需要什么?由于潜在的副作用和性能,我不想多次调用函数,因为我计划对JavaScript进行检测,以使每行源代码(实际上是每个表达式)具有准确的内存分配信息。 PS:我知道Chrome DevTools中的内存分析工具。
// noprotect
// run Chrome with --enable-precise-memory-info --js-flags="--expose-gc"
var mdiffs = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var as = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
function measure(i, f) {
window.gc();
var mem1 = window.performance.memory.usedJSHeapSize;
var a = f();
window.gc();
var mem2 = window.performance.memory.usedJSHeapSize;
var mdiff = mem2 - mem1;
mdiffs[i] = mdiff;
as[i] = a;
}
function falloc() {
return {};
}
function falloc2() {
return {0: 0};
}
for (var i = 0; i < 5; i++) {
measure(i, falloc);
}
for (var i = 5; i < 10; i++) {
measure(i, falloc2);
}
console.log("mdiff", mdiffs);
我开始使用V8 / Chromium源代码来做我想做的事情。第一个琐碎的补丁程序,用于在调用堆栈中的https://gist.github.com/emnh/268635258f66d774d02dae64f35b46f3处转储所有内存分配的堆栈跟踪,这些内存分配包含一个称为“ measure”的函数。