在V8 JavaScript中检测内存分配

时间:2018-09-02 13:50:01

标签: javascript garbage-collection v8

编辑:似乎新的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”的函数。

0 个答案:

没有答案