Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с finalize() и циклическими ссылками 
:(
    Опции темы
afiskon
Дата 14.11.2011, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: нет
Всего: 4



В языке Python есть такая известная проблема. Представьте, что у вас есть два объекта, ссылающиеся друг на друга и имеющие прописанные программистом деструкторы. Пришло время для сборки мусора. Вопрос - какой объект удалить первым? Мы ведь не знаем точно, что происходит в деструкторах. А вдруг он использует ссылку на объект, который мы только что удалили? Python в таких случаях ничего не делает и оставляет объекты в памяти до завершения программы. Решается проблема с помощью weakptr.

Скажите, а что делает Java с в аналогичной ситуации? Да, я знаю, что finalize() - это не деструктор, но все же, согласитесь, что ситуация аналогичная. Может, перед вызовом finalize() всем внешним ссылкам присваивается null?
PM MAIL WWW   Вверх
Kangaroo
Дата 14.11.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Я думаю, что сначала finalize() вызывается для 2 объектов и только потом они удаляются.

А вообще не надо использовать finalize().


--------------------
Lost....
PM MAIL MSN   Вверх
afiskon
Дата 14.11.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: нет
Всего: 4



Kangaroo, а нет ли способа узнать более точно? Экспериментальным образом или обратившись к некой документации? А то я небольшой спец по Java.
PM MAIL WWW   Вверх
Skynin
Дата 14.11.2011, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 6
Всего: 10



finalize() настолько не деструктор что проблема такая непонятно откуда возникает. Он может вообще не вызваться за все время работы программы.
2ое - порядок его вызова неопределен. Сборщик мусора при первом освобождении объекта ставит его в очередь
3е - странности_финализации

Цитата

Может, перед вызовом finalize() всем внешним ссылкам присваивается null?

Не может. Сборщик мусора таких не занимается.

Если ваши объекты ссылаются друг на друга да еще почему-то используют finalize(), которому нужны работающие ссылки на другие объекты, то сами и разбирайтесь, зачем так сложно понакрутили?
Можно еще глянуть на фантомные ссылки:
Гугл: Java фантомные ссылки
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1038 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.