У меня возникла проблема с диагностикой утечки памяти отдельного дерева DOM в очень большом одностраничном веб-приложении, созданном в основном с помощью Knockout.
Я настроил приложение, чтобы прикрепить объект dummy FooBar
к определенному элементу кнопки HTML, который должен быть собран с помощью мусора, когда пользователь переходит на другую "страницу" приложения. Используя функцию моментального снимка кучи Chrome, я вижу, что старый FooBar
экземпляр (который должен был быть GC'ed) по-прежнему доступен из его HTMLButtonElement
в (большом) отдельном дереве DOM.
Отслеживая ссылки через панель сохранения дерева, я следую за цепочкой, уменьшающей расстояние от корня GC. Однако в какой-то момент мой поиск достигает тупика на расстоянии node от корня (в данном случае)! Сохраняющее дерево вообще не сообщает об этом node, но как-то знает, что оно находится в четырех шагах от корня GC.
Вот часть удерживающего дерева, которое меня озадачивает (числа справа являются расстояниями от корня):
v foobar in HTMLButtonElement 10
v [4928] in Detached DOM tree / 5643 entries 9
v native in HTMLOptionElement 8
v [0] in Array 7
v mappedNodes 6
v [870] in Array 5
v itemsToProcess in system / Context 4
context in function itemMovedOrRetained()
context in function callCallback()
Сохраняющее дерево не показывает ссылки здесь на расстоянии 3 или выше.
Может кто-нибудь объяснить это мне? Я надеялся, что смогу следить за ссылочной цепочкой, чтобы вернуться к нарушающей части кода приложения JavaScript, но у меня все в порядке!