Почему мой Chrome Profiler не показывает правильные пути сохранения моих объектов и почему мои объекты никогда не освобождаются? - PullRequest
23 голосов
/ 29 февраля 2012

Я пытаюсь отладить утечки памяти в моем веб-приложении.

Я делаю снимки кучи и сравниваю разные кучи.

Я обнаружил, что некоторые из моих объектов куда-то ссылаются.Однако все мои объекты сохраняются через объекты, которые выглядят для меня внутренними, например:

Profiler showing my classes being referenced

Как вы можете видеть, этот SectionNavView объект находитсяна него ссылаются несколько методов, которые я создал: cleanUp, hide, isShown и т. д. с использованием моей локальной переменной, но на эти методы ссылается то, что я не контролирую: idToWrappedObject .Иногда есть другой посредник - объект injectedScript .

Если на мои объекты ссылаются только из внутренних ссылок V8, не должны ли они быть освобождены до того, как профилировщик сделает снимок во время своего GC?

1 Ответ

36 голосов
/ 21 октября 2012

Это просто означает, что вы использовали console.log. Поэтому виртуальная машина хранит ссылку на ваши объекты, чтобы вы могли проверить их позже. Вы можете либо прекратить использование консоли, либо просто очищать ее каждый раз, когда делаете снимок кучи.

Вы можете воспроизвести его с помощью следующих шагов:

  1. Открыть новую вкладку
  2. Открыть консоль (очистить, если есть)
  3. Снимок кучи 1
  4. Введите console.log({ foo:'bar' }) в консоли
  5. Снимок кучи 2
  6. Очистить консоль
  7. Снимок кучи 3

Затем просмотрите результаты:

  1. Открыть представление сравнения между снимком 2 и снимком 1; вы найдете { foo: 'bar' } объект

    Comparison of snapshots 1 and 2, the foobar object is visible; unfold the Object constructor

  2. Открыть представление сравнения между снимком 3 и снимком 2; вы обнаружите, что тот же объект теперь отображает дельту -1, что означает, что он был удален после очистки консоли

    Comparison of snapshots 2 and 3, the foobar object is visible, but the column delta shows it was deleted

Наконец, вы можете также увидеть «Глобальные дескрипторы», а затем «Корни GC» в путях сохранения дерева, рядом с _idToWrappedObject и InjectedScript. Я не уверен, как это относится к определению корней GC, но очистка консоли позволяет собирать мусор.

...