Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сборщик мусора (https://javascript.ru/forum/misc/7718-sborshhik-musora.html)

Мараторий 16.02.2010 11:29

Сборщик мусора
 
Я тут задумался, а как работает сборщик мусора в JS?
//
var obj = {a: 10}; // Создается в памяти некий "объект 1"
var container = {o: obj}; // Создается в памяти некий "объект 2", в котором есть ссылка на "объект 1"
obj = container = null;
При этом сначала из памяти удалиться "объект 2", поскольку на него больше никто не ссылается.
А потом и "объект 1", поскольку теперь и на него никто не ссылается.
Пока вроде все правильно.

А если так?
var obj = {a: 10}; // Создается в памяти некий "объект 1"
var container = {o: obj}; // Создается в памяти некий "объект 2", в котором есть ссылка на "объект 1"
obj.c = container; // Создаем обратную ссылку
obj = container = null;
Теперь "объект 1" не может быть удален, поскольку на него ссылается "объект 2".
А "объект 2" не может быть удален, поскольку на него ссылается "объект 1".

1. Я правильно понимаю?
2. И единственный выход удалить объекты из памяти - вручную поудалять обратные ссылки?

x-yuri 17.02.2010 06:09

Most web browsers leak memory like a bloody sieve

Мараторий 17.02.2010 07:22

Цитата:

Сообщение от x-yuri (Сообщение 45114)

Насколько я понимаю, утечки не возникают из-за JS, а возникают на стыке JS и DOM. С этим ясно.
+ ФФ вроде уже не течет, поправьте меня, если ошибаюсь.

Я же спрашиваю, как работает сборщик мусора в JS без учета DOM. Привел конкретный пример. В этом примере объекты останутся висеть в памяти, пока страница не будет перегружена?

Riim 17.02.2010 07:29

Мараторий, а что мешает проверить?

Tim 17.02.2010 10:03

В "JavaScript - The Definitive Guide" на стр 160. про это есть.

Цитата:

И единственный выход удалить объекты из памяти - вручную поудалять обратные ссылки?
по логике да, за то что удалится нужный объект я думаю беспокоится не стоит (предполагается, что вы не подгружаете JS код динамически), а вот не удалиться может, но на токое только IE способен.

добавлено спустя 2 минуты:
Хотя мне кажется, что если сборщик увидит что не сам объект не переменные хранящие ссылки больше не используются, то может и удалить.

P.S.: хитрая это тема...

Мараторий 17.02.2010 17:37

Цитата:

Сообщение от Riim (Сообщение 45121)
Мараторий, а что мешает проверить?

И как вы предлагаете мне это сделать?

P.S. Ответа на свой вопрос я так и не получил. Просто хочется понять принцип + узнать, надо ли обрывать циклические ссылки самому или движок сам все сделает?

x-yuri 17.02.2010 19:12

Цитата:

Сообщение от Мараторий
P.S. Ответа на свой вопрос я так и не получил.

Цитата:

JavaScript uses (sometime after Netscape 2.0, I think) a fully garbage-collected memory allocator. For anyone who doesn't understand this, this simply means that memory can never be truly leaked, even when objects reference each other circularly (e.g. A->B->A).
а это что?

Мараторий 17.02.2010 19:41

Цитата:

Сообщение от x-yuri (Сообщение 45220)
а это что?

Спасибо, не очень внимательно прочел статью.

Riim 18.02.2010 04:57

Цитата:

Сообщение от Мараторий
И как вы предлагаете мне это сделать?

в цикле запускать функцию в которой такое делается, или с eval что-нибудь выдумать.

Tim 18.02.2010 07:19

Цитата:

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

P.S.: Проверить что-то лень. Извините.

x-yuri 18.02.2010 07:43

есть еще другой момент. А как узнать, что память не вернулась? Почему бы браузеру не оставить себе выделенную память, раз уж тут такие скрипты выполняются? Т.е. сами объекты были удалены, а память системе не вернулась

DooMer 19.02.2010 12:11

а хачем присваиваить налл ? есть же оператор delete

Kolyaj 19.02.2010 12:26

DooMer,
delete не удаляет переменные.

DooMer 19.02.2010 12:46

Kolyaj,
действительно не удаляет, извините


Часовой пояс GMT +3, время: 01:58.