Я читал некоторые документы о .NET сборщика мусора, но я до сих пор есть некоторые сомнения (примеры в C#):Сомнения .NET сборщика мусора
1) Имеет ли GC.Collect() называют частичное или полная коллекция? 2) Выполняет ли частичная сборка выполнение приложения «жертва»? Если да, то я предполагаю, что это очень «легкие» вещи, которые нужно делать, так как я запускаю игровой сервер, который использует 2-3 ГБ памяти, и у меня «никогда» нет остановки выполнения (или я не вижу их.). 3) Я читал о корнях GC, но до сих пор не могу понять, как именно они работают. Предположим, что это код (C#):
MyClass1:
[...]
public List<MyClass2> classList = new List<MyClass2>();
[...]
Главная:
main()
{
MyClass1 a = new MyClass1();
MyClass2 b = new MyClass2();
a.classList.Add(b);
b = null;
DoSomeLongWork();
}
Будет ли когда-нибудь б иметь право быть мусора (до завершения работы DoSomeLongWork)? Ссылка на b, что содержит классList, может ли он считаться корнем? Или корень - это только первая ссылка на экземпляр? (я имею в виду, что b - это корневая ссылка, потому что там создается экземпляр).
О вашем третьем ответе, почему вы говорите «если строка b = null не была там»? Если линия WAS там, то вещи, которые вы описали (в режиме выпуска), не произойдет? И я все еще не могу понять, работает ли ссылка в Списке в качестве действительной ссылки, или если я делаю b = null, а затем запускает сборщик мусора, я обнаружил бы, что ссылка List ссылается на null. – Smjert
Извините, я отредактировал мое сообщение. Ссылка в списке не считается корнем, потому что вы можете добраться до нее только через 'a' - и этот объект имеет право на сбор, поэтому список имеет право (если ничего не ссылается на него), поэтому' b' имеет право , – thecoop
a и b не ссылаются снова * до * DoSomeLongWork. Они оба будут собирать мусор, если GC происходит, когда DoSomeLongWork работает. Это не может вызвать проблемы, поскольку ссылки отсутствуют. –