Как возникла эта утечка памяти? - PullRequest
0 голосов
/ 26 апреля 2018

ОБНОВЛЕНИЕ: Полагаю, я должен предположить, что мое понимание верно (возможно, но если у вас есть лучшее объяснение, , пожалуйста, дайте мне знать ), просто нужно принятьнемного больше времени для Chrome на сборку отдельных DOM (я не знаю, сколько времени это займет, много раз он вообще не собирается GC в течение довольно долгого времени)

enter image description here


Все:

Я довольно новичок в управлении памятью Javascript, когда читаю Google Chrome (Версия 65.0.3325.181 (Официальная сборка) (32-разрядная версия) Windows 7) Devtoolучебник, есть один пример:

Обнаружение утечек памяти в отдельном дереве DOM с помощью снимков кучи

var detachedNodes;

function create() {
  var ul = document.createElement('ul');
  for (var i = 0; i < 10; i++) {
    var li = document.createElement('li');
    ul.appendChild(li);
  }
  detachedNodes = ul;
}

document.getElementById('create').addEventListener('click', create);

Я думаю, причина в том, что я не понял, как работает DOM вобъем памяти.

Моя мысль такова: каждый раз при щелчке создается контекст выполнения, созданный для create, вводится локальная переменная ul, ссылающаяся на объект UL, сгенерированный в куче, затем 10 li, сгенерированный в куче, и связанный с объектом ULзатем на объект UL ссылается detachedNode. И я подумал: после вызова create () ссылка между detachedNode и предыдущим объектом UL будет прервана (генерируется во время вызова create () до этого клика), а document.createElement только создает, но не добавляет, поэтомучто объект UL должен быть GCed.

Интересно, почему этот объект UL в куче не может быть GCed?

enter image description here

1 Ответ

0 голосов
/ 26 апреля 2018

Если я нажму кнопку один раз, она создаст дерево DOM под этим элементом ul, а затем назначит его глобальной переменной detachedNodes (т. Е. detachedNodes будет ссылаться на этот объект в памяти).

Если я щелкну по нему еще раз, оно назначит новое дерево элементов ul для detachedNodes, но теперь на старый элемент ul больше не будут ссылаться.В этом случае дерево ul с первого клика будет собирать мусор, поскольку ссылок на него больше не существует.

Итак, чтобы ответить на ваш вопрос: да, этот первый узел может быть собран мусором.Статья Google, на которую вы ссылаетесь, похоже, не подразумевает иное;это не касается нажатия кнопки более одного раза из того, что я вижу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...