Исследование утечек памяти
Если вы исследуете утечку памяти и задаетесь вопросом, почему объект не собирается сборщиком мусора, вы можете использовать %DebugTrackRetainingPath(object)
для вывода фактического пути удержания объекта при каждом GC.
Для этого требуются флаги времени выполнения --allow-natives-syntax --track-retaining-path
, которые работают как в режиме релиза, так и в режиме отладки. Подробнее в описании CL.
Рассмотрим следующий test.js
:
function foo() {
const x = { bar: 'bar' };
%DebugTrackRetainingPath(x);
return () => { return x; }
}
const closure = foo();
gc();
Пример (используйте режим отладки или v8_enable_object_print = true
для гораздо более подробного вывода):
$ out/x64.release/d8 --allow-natives-syntax --track-retaining-path --expose-gc test.js
#################################################
Путь удержания для 0x245c59f0c1a1:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Расстояние от корня 6: 0x245c59f0c1a1 <Object map = 0x2d919f0d729>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Расстояние от корня 5: 0x245c59f0c169 <FixedArray[5]>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Расстояние от корня 4: 0x245c59f0c219 <JSFunction (sfi = 0x1fbb02e2d7f1)>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Расстояние от корня 3: 0x1fbb02e2d679 <FixedArray[5]>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Расстояние от корня 2: 0x245c59f0c139 <FixedArray[4]>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Расстояние от корня 1: 0x1fbb02e03d91 <FixedArray[279]>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Корень: (Изолят)
-------------------------------------------------
Поддержка отладчика
Во время сеанса отладки (например, gdb
/lldb
), и если вы передали вышеупомянутые флаги процессу (то есть --allow-natives-syntax --track-retaining-path
), вы можете использовать print isolate->heap()->PrintRetainingPath(HeapObject*)
для объекта, который вас интересует.