Инструментарий выделения памяти в V8 JavaScript - PullRequest
0 голосов
/ 02 сентября 2018

РЕДАКТИРОВАТЬ: похоже, что в новой версии Firefox Developer Edition есть инструменты, необходимые для профилирования распределения памяти, поэтому мне не нужен ответ на этот вопрос, но мне все еще интересно, что происходит за кулисами в Chrome.

Почему код ниже регистрирует что-то вроде

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 (или узел с настроенным скриптом))?

Я подозреваю, что Major GC не вызывается сразу в первом window.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.

...