Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.02.2010, 11:29
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Сборщик мусора
Я тут задумался, а как работает сборщик мусора в 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. И единственный выход удалить объекты из памяти - вручную поудалять обратные ссылки?
Ответить с цитированием
  #2 (permalink)  
Старый 17.02.2010, 06:09
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Most web browsers leak memory like a bloody sieve
Ответить с цитированием
  #3 (permalink)  
Старый 17.02.2010, 07:22
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Сообщение от x-yuri Посмотреть сообщение
Most web browsers leak memory like a bloody sieve
Насколько я понимаю, утечки не возникают из-за JS, а возникают на стыке JS и DOM. С этим ясно.
+ ФФ вроде уже не течет, поправьте меня, если ошибаюсь.

Я же спрашиваю, как работает сборщик мусора в JS без учета DOM. Привел конкретный пример. В этом примере объекты останутся висеть в памяти, пока страница не будет перегружена?
Ответить с цитированием
  #4 (permalink)  
Старый 17.02.2010, 07:29
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Мараторий, а что мешает проверить?
Ответить с цитированием
  #5 (permalink)  
Старый 17.02.2010, 10:03
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

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

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

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

P.S.: хитрая это тема...
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)

Последний раз редактировалось Tim, 17.02.2010 в 10:09.
Ответить с цитированием
  #6 (permalink)  
Старый 17.02.2010, 17:37
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

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

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

Последний раз редактировалось Мараторий, 17.02.2010 в 19:42.
Ответить с цитированием
  #7 (permalink)  
Старый 17.02.2010, 19:12
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Мараторий
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).
а это что?
Ответить с цитированием
  #8 (permalink)  
Старый 17.02.2010, 19:41
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Сообщение от x-yuri Посмотреть сообщение
а это что?
Спасибо, не очень внимательно прочел статью.
Ответить с цитированием
  #9 (permalink)  
Старый 18.02.2010, 04:57
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Мараторий
И как вы предлагаете мне это сделать?
в цикле запускать функцию в которой такое делается, или с eval что-нибудь выдумать.
Ответить с цитированием
  #10 (permalink)  
Старый 18.02.2010, 07:19
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

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

P.S.: Проверить что-то лень. Извините.
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сборщик мусора в JavaScript freebit Events/DOM/Window 14 04.12.2008 23:58