Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> финалайзер во втором поколении 
V
    Опции темы
gambit
Дата 20.8.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Гдето слышал (ну присниться не могло) что если объект попал во второе поколение GC и у него есть финализатор, то объект не будет удален до завершения программы, даже если он не нужен. Кто, что слышал по этому поводу?
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 20.8.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(gambit @  20.8.2010,  12:49 Найти цитируемый пост)
Гдето слышал (ну присниться не могло) что если объект попал во второе поколение GC и у него есть финализатор, то объект не будет удален до завершения программы, даже если он не нужен. Кто, что слышал по этому поводу? 

Фигня.

При создании объекта с finilizer-ом .NET добавляет его указатель в finilization list. Перед удалением Garbage Collector ищет указатель на объект в finilizer list, и если он есть - объект не удаляется, а указатель на него помещается в так называемый f-reachable queue. Отдельный поток (может и не один) вызывает finilizer-ы для объектов, находящихся в f-reachable queue. После вызова finilizer-а поток его оттуда удаляет и теперь уже наш объект ни в чем не нуждается и уже при следующем вызове сборщика мусора удалится навсегда. Разве что, если в finilizer-е не сохранить указатель на объект в какой нибудь статический указатель.


Это сообщение отредактировал(а) azesmcar - 20.8.2010, 13:27
PM   Вверх
gambit
Дата 20.8.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Цитата(azesmcar @  20.8.2010,  13:23 Найти цитируемый пост)
Фигня.
При создании объекта с finilizer-ом .NET добавляет его указатель в так называемый finilization list. Перед удалением Garbage Collector ищет указатель на объект в finilizer list, и если он есть то объект не удаляется, а указатель на него перемещается в f-reachable queue. Отдельный поток (может и не один) вызывает finilizer-ы для объектов, находящихся в f-reachable queue. После вызова finilizer-а поток его оттуда удаляет и теперь уже наш объект ни в чем не нуждается и уже при следующем вызове сборщика мусора удалиться навсегда. Разве что, если в finilizer-е не сохранить указатель на объект в какой нибудь статический указатель.

я умом понимаю, что фигня, но откуда то я это взял. Я не отрицаю, может из какой ниб левой статейки прыщавого школьника, но где то читал. Типа все ок, но если объект во втором поколении, то происходит какая то лажа с его удалением.
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 20.8.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



gambit

Ну может хотя бы подскажешь где? А то сложно отвечать на то, не знаю что smile 
можно проверить
Код

class A
{
    ~A()
    {
        Console.WriteLine("finilizer called");
    }
}
static void Main()
{
    A v = new A();
    GC.Collect();
    Console.WriteLine("Object v is now in generation {0}", GC.GetGeneration(v));
    GC.Collect();
    Console.WriteLine("Object v is now in generation {0}", GC.GetGeneration(v));
    v = null;
    GC.Collect();
    Console.ReadLine();
}

finilizer вызывается, правда это конечно не значит, что объект удален из памяти, но мы же не берем в расчет баги smile раз finilizer вызван и и дальше ему ничего не мешает - объект будет удален.

Это сообщение отредактировал(а) azesmcar - 20.8.2010, 13:58
PM   Вверх
gambit
Дата 20.8.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



так вопрос закрыт. Скорее всего это из серии "слышал звон". Если объект доживает до 2 поколения без вызова финализатора, то до удаления должно проити две сборки мусора в 2 поколении, чего чаще всего не происходит. Может я на основе этого сделал вывод, что он не будет удален, а может и правда где ниб. прочитал
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 20.8.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(gambit @  20.8.2010,  14:09 Найти цитируемый пост)
Если объект доживает до 2 поколения без вызова финализатора, то до удаления должно проити две сборки мусора в 2 поколении, чего чаще всего не происходит. 

Я тоже предполагал что-то вроде этого, но это не вяжется с finilizer-ом, он тут не причем, это утверждение верно и без finilizer-а, просто finilizer увеличит жизнь объекта на еще одну сборку. Автоматическая сборка мусора начинается тогда, когда в 0-м поколении больше нет места, причем начинается чистка с поколения 0, и если все хорошо - до поколения 1 дело не дойдет, что уж тут говорить про поколение 2, туда garbage collector вообще редко заглядывает, на практике в некоторых случаях этот объект может и не будет удален до конца работы программы, но теоретически его удалению ничего не препятствует.

Это сообщение отредактировал(а) azesmcar - 20.8.2010, 14:18
PM   Вверх
gambit
Дата 20.8.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Цитата(azesmcar @  20.8.2010,  14:14 Найти цитируемый пост)
туда garbage collector вообще редко заглядывает

Цитата(azesmcar @  20.8.2010,  14:14 Найти цитируемый пост)
просто finilizer увеличит жизнь объекта на еще одну сборку

вот на основе этого, как то я и отрекся от мысли 
Цитата(azesmcar @  20.8.2010,  14:14 Найти цитируемый пост)
 но теоретически его удалению ничего не препятствует


спасибо.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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