- 1
- 2
- 3
- 4
- 5
- 6
public static class GC
{
public static void KeepAlive(Object obj)
{
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−137
public static class GC
{
public static void KeepAlive(Object obj)
{
}
}
Супер метод в ГЦ. И более того - рабочий метод :). Работает на 100%. Кто раскажет почему :)?
Выдвину гипотезу: промежуток времени, в течение которого объект жив, всегда непрерывен. Сборщик мусора начнёт работать только после последнего упоминания объекта в коде. Значит, можно гарантировать, что до вызова GC.KeepAlive(obj) объект obj не уберётся мусоросборщиком. Поскольку KeepAlive ничего не делает с объектом, то после вызова этого метода объект можно спокойно удалить.
Но как мусоросборщик определяет, что до вызова GC.KeepAlive(obj) объект нельзя удалять? Он сканирует весь исполнимый образ на предмет упоминания obj?
Тред, который вызывает KeepAlive, должен иметь ссылку на объект, чтобы передать её в KeepAlive, нет?
Все верно. Что бы не дать ГЦ собрать мусор вызывая пустой метод KeepAlive(x), x - будет помещен в стэк (для вызова метода KeepAlive) а значит для ГЦ обьект будет отмечен как используем и не будет собран :)
Так есть шанс, что Вашему собеседнику пришлют уведомление, и он вернётся в беседу.
Есть.