Какие алгоритмы сбора мусора используют все 5 основных браузеров?

В настоящее время я переосмысливаю объект, который обрабатывает обработку JavaScript-инфраструктуры qooxdoo.
Посмотрите на следующую диаграмму (в настоящее время область A):

диаграмма http://yuml.me/51747906.jpg

Скажем, мы хотим удалить B. Как правило, мы режем всю ссылку между всеми объектами. Это означает, что мы разрезаем соединение 1-5 в примере. Это действительно необходимо?
Насколько я читал здесь, браузеры используют алгоритм mark-and-sweep. В этом случае нам просто нужно вырезать ссылку 1 (соединение с областью) и 5 ​​(соединение с DOM), которая может быть намного быстрее.
Но могу ли я быть уверенным, что все браузеры используют алгоритм маркировки и развертки или что-то подобное?

Ответ 1

Для любого приличного сборщика мусора (не только для маркировки и прокрутки) разрезающее соединение 1 будет достаточно для выпуска B (и C и D и окна). Распределение, основанное на подсчете ссылок, не сможет освободить B и D из-за их циклических ссылок (B ссылается на ссылки D и D B), но подсчет ссылок на самом деле не является сборкой мусора.

Я думаю, можно с уверенностью предположить, что все браузеры используют приличный сборщик мусора (ну, с браузерами, ничто никогда не будет действительно безопасным, но реализация JavaScript, не использующая надлежащего сборщика мусора, тем не менее невероятна).

Ответ 2

Дело в том, что в идеальном мире вам просто нужно отключить узлы DOM и собственные прослушиватели событий. Проблема в том, что исходная система в qooxdoo была разработана вокруг багги-браузеров, таких как IE6. Мы видели значительно уменьшенное использование памяти, когда мы удаляем как можно больше самостоятельно. В сегодняшнем мире я бы, однако, перепроектировал его таким образом, чтобы это было нормально в IE6, но не оптимизировано для его проблем.

Также существует разница в полном завершении всего приложения (распоряжаться всем) и просто удалять одну часть приложения. В последнем сценарии вам нужно действовать достаточно осторожно, чтобы не уничтожать вещи, которые по-прежнему нужны.