У меня возникли проблемы с диагностикой утечки памяти отдельного DOM-дерева в очень большом одностраничном веб-приложении, созданном в основном с помощью Knockout.Поиск утечки памяти дерева DOM
Я настроил приложение, чтобы прикрепить объект dummy FooBar
к определенному элементу кнопки HTML, который должен быть собран с помощью мусора, когда пользователь переходит на другую «страницу» приложения. С помощью моментального снимка в куче, я вижу, что старый (FooBar
) экземпляр (который должен был быть GC'ed) по-прежнему доступен из его HTMLButtonElement
в (большом) отдельном дереве DOM.
Отслеживание ссылок через удерживающее дерево панель, я следую за цепью, уменьшая расстояние от корня GC. Однако в какой-то момент мой поиск достигает тупика на расстоянии 4 узла от корня (в данном случае)! Сохраняющее дерево вообще не сообщает об этом узле, но как-то знает, что оно находится в четырех шагах от корня 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, но у меня все в порядке!
Можете ли вы поделиться некоторыми из кода, в частности, где этот элемент создан и где он расположен? – Etai
Я боюсь, что код проприетарный и огромный; У меня не было возможности попробовать воспроизвести его в маленьком. Реальная проблема здесь заключается в том, почему профилировщик Chrome heap должен когда-либо сообщать о чем-то подобном выше, который не выходит за пределы корня (как это может быть ?!). – Rafe
Вы должны удалить свойство 'foobar' (с помощью' delete'; 'delete button.foobar' перед удалением элемента' DOM' и убедитесь, что нет оставшихся прослушивателей событий. – GuyT