Re[3]: Не понимаю поведение GC
От: Mab Россия http://shade.msu.ru/~mab
Дата: 07.11.05 23:14
Оценка: 8 (2)
Здравствуйте, FlyDN, Вы писали:

FDN>MSDN говорит.

Увы, но действительно говорит он неправду И приведенный пример подтвреждает это.

FDN>То есть Timer в финализаторе не удаляет ссылку.

Да нет, Timer здесь не виноват. Это проблема дизайна. Зарегистрированный таймер получает ссылку от GC root-а. Соответственно, пока не будет Dispose он будет жить.

Для доказательства запустил пример под MemoryProfiler. Он показывает такую цепочку ссылок до Test:
System.Threading    TimerCallback
System.Threading    _TimerCallback
<root>

А вот точка создания _TimerCallback:
TimerBase.AddTimer(TimerCallback, object, uint, uint, StackCrawlMark&)
Timer.TimerSetup(TimerCallback, object, uint, uint, StackCrawlMark&)
Timer..ctor(TimerCallback, object, int, int)
Program.Test..ctor()
Program.Main()
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.