Удаляет ли сборщик мусора удаленные элементы из двусвязного списка с заданным кодом?

У меня есть двусвязный список, в котором каждый объект имеет данные и указатель на следующий объект и указатель на предыдущий объект, например:

obj1 <-> obj2 <-> obj3 <-> obj4 <->

Я использую этот код для удаления obj3 и obj4: предположим, что p - это данные obj2

let b = head;
while(b.next!=null){
b=b.next
if(b.data === p){
b.next = null;}}

При таком способе удаления указатель на obj3 теряется, поэтому obj3 и obj4 недоступны, но obj3 имеет указатель на obj2 в obj3.previous.

Мой вопрос: если я использую этот код для удаления obj3 и obj4, удалит ли сборщик мусора obj3 и obj4 из памяти? Если да, то как он понимает, что obj3 недоступен (будет ли он перебирать связанный список? Если да, операция займет время O (n)?). Мне важно знать, насколько сборка мусора javascript замедлит время выполнения (список очень длинный, и его повторение займет некоторое время)


person mohammadtz55    schedule 03.12.2019    source источник


Ответы (1)


Существуют различные стратегии сборки мусора, которые отлично работают с циклическими ссылками, одна из них — "отметить и убрать" . Современные двигатели используют эти стратегии. V8, например, делает то же самое.

если я использую этот код для удаления obj 3 и obj 4, будет ли сборка мусора удалять obj3 и 4 из памяти?

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

и если да, то как понять, что obj 3 недоступен?

Если он использует пометку и развертку, он будет следовать всем ссылкам от всех переменных и далее и отмечать все объекты. Затем он пройдет через кучу и зачистит все объекты, которые не отмечены.

операция займет время O (n) ?

да. Чем больше памяти вы используете, тем больше работы приходится выполнять сборщику мусора.

потому что я пишу код, и для меня важно, насколько сборка мусора javascript замедлит выполнение кода

Тогда как насчет... проверки того, насколько быстр ваш код и сколько времени занимает сборка мусора?

person Jonas Wilms    schedule 03.12.2019