Подтвердить что ты не робот

Почему мой Chrome Profiler не показывает правильные пути сохранения для моих объектов и почему мои объекты никогда не выпущены?

Я пытаюсь отлаживать утечки памяти в моем webapp.

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

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

Profiler showing my classes being referenced

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

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

4b9b3361

Ответ 1

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

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

  • Откройте новую вкладку
  • Откройте консоль (очистите ее, если есть что-нибудь)
  • Сделать снимок кучи 1
  • Введите console.log({ foo:'bar' }) в консоли
  • Сделать снимок кучи 2
  • Очистить консоль
  • Сделать снимок кучи 3

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

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

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

  • Открыть представление сравнения между моментальным снимком 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, но очистка консоли позволяет сборку мусора.