Как происходит сборка мусора для классов, имеющих статические методы в C # / VB.NET? - PullRequest
6 голосов
/ 30 ноября 2009

Значит ли установка объекта в null ОТДЕЛЕНА для ГХ?

РЕДАКТИРОВАТЬ: класс имеет несколько статических методов. При использовании этих методов в вашей программе, каков наилучший способ гарантировать, что объекты помечены для GC после определенного момента?

Ответы [ 4 ]

11 голосов
/ 30 ноября 2009

Методы вообще не являются сборщиком мусора - поэтому не совсем понятно, что означает ваш вопрос.

Аналогично, вы никогда не устанавливаете объект на ноль. Вы можете сделать значение переменной пустым, но это не имеет ничего общего с любым объектом, на который ранее ссылалась переменная. Это просто означает, что в следующий раз, когда сборщик мусора будет искать живой объект, эта переменная не будет вносить какой-либо объект в набор объектов, которые должны быть сохранены в конце GC.

Я предлагаю вам прочитать статью Джеффри Рихтера о сборке мусора , чтобы немного подробнее рассказать, а затем задать любые дополнительные конкретные вопросы, когда вы освоите основы.

4 голосов
/ 30 ноября 2009

Если вы спрашиваете, что происходит с объектами, на которые ссылаются переменные в статических методах, то эти объекты становятся понятными для сборки мусора, когда они больше не находятся в области видимости.

Если вы говорите об объектах, на которые ссылаются статические поля, то они, проще говоря, не будут собираться до тех пор, пока для ссылок не будет установлено значение null.

Следующий пример может проиллюстрировать это лучше:

class Example
{
    private static object field1 = new object();

    public static void SomeMethod()
    {
        object variable1 = new object();

        // ...
    }

    public static void Deref()
    {
        field1 = null;
    }
}

Объект, на который ссылается field1 , будет создан при загрузке класса и останется корневым даже при создании и уничтожении объектов класса Example. Единственный способ собрать этот объект - это вызвать метод Deref (), который разыменует его, установив ссылку на null. (На самом деле, можно выгрузить классы, выгружая домен приложения, но это несколько сложнее, и вы не часто сталкиваетесь с этим.)

И наоборот, статический метод SomeMethod () создает объект и ссылается на него с помощью переменной variable1 . Этот объект доступен для сборки мусора, как только он выходит из области видимости (в конце метода). Практически, он может быть собран раньше, если остальная часть метода не ссылается на него.

3 голосов
/ 30 ноября 2009

объекты не помечены для GC, они помечены (наличием переменной, которая ссылается на них или указывает на них) на НЕ Быть мусором. Когда каждая переменная или ссылка на объект во всех запущенных потоках, а также во всех глобальных статических переменных и во всех регистрах процессора была удалена, вышла из области видимости или была установлена ​​в значение NULL, тогда объект больше не доступен, и GC соберет это.

0 голосов
/ 30 ноября 2009

Думайте о статических методах как о классе методах. Они доступны независимо от того, существует объект или нет. Они не влияют на сборку мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...