Когда происходит сборка мусора для класса со статическими данными - PullRequest
5 голосов
/ 17 июня 2009

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

Некоторое время это работало нормально, но сейчас, когда я ожидаю, что смогу получить ArrayList, все, что я получу, это "null".

Мне интересно, был ли статический класс отправлен "сборщику мусора". Не уверен, что происходит, если вы можете помочь, это будет высоко ценится.

Ответы [ 10 ]

9 голосов
/ 17 июня 2009

вы можете попытаться сделать его окончательным и перекомпилировать код, чтобы увидеть, ИЗМЕНИЕТ ли какой-нибудь другой класс ссылку на нуль:

public class Global {

    public final static List<String> data = new ArrayList<String>();

}

это позволяет написать:

Global.data.add("foo");

но не:

Global.data = null;
3 голосов
/ 17 июня 2009

Оригинальный вопрос:

Когда происходит сборка мусора для статического класса?

Ответ: Когда ваше приложение закрывается.

3 голосов
/ 17 июня 2009

Как сказал Светлио, сборщик мусора работает только с объектами в куче, на которые нигде нет ссылок. Это может занять х количество циклов в зависимости от того, какую GC-стратегию и виртуальную машину вы используете. Поскольку на статические классы ссылаются неопределенно, они никогда не будут GC'd.

Таким образом, остаются некоторые проблемы:

  1. Может ли это быть частью вашей программы установки класса на ноль? Можете ли вы установить флаг отладки, чтобы кричать всякий раз, когда ваш массив списков равен нулю?
  2. Это происходит в определенное время? При запуске? Через некоторое время?
  3. Тупой вопрос, но вы никогда не запускаете new на своем статическом классе?

Наконец, как вы сказали ... статические переменные сосут для чего угодно, кроме констант: P Одноэлементная конфигурация действительно дешевая и намного лучше.

3 голосов
/ 17 июня 2009

У меня есть несколько переменных в статическом класс, в который пишут ... в несколько разных точек.

По мере того, как вы признаетесь, переменной можно присвоить нуль в одной или нескольких из этих разных точек. :)

2 голосов
/ 17 июня 2009

Сборка мусора для классов происходит, если загрузчик классов получает сборщик мусора. См. этот вопрос , например. В ранней Java (я думаю, в 1.2) было время сортировки, когда статические поля не рассматривались GC, и большое количество классов unload / reload вызывало пустые поля.

2 голосов
/ 17 июня 2009

Если вы можете вызвать функцию, то объект не будет убран мусором, потому что на него все еще есть ссылка. Вы храните указатель на массив или сам объект?

1 голос
/ 17 июня 2009

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

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

Вы создаете несколько экземпляров и ожидаете, что они будут одинаковыми?

GC не звучит так, как будто это проблема. Если объекта больше нет, вы вообще не сможете извлечь ArrayList из него.

0 голосов
/ 24 июня 2014

что-то вроде этого

private static List<T> list;


public static List<T> getList() {
    if(list==null)
        initList(); //private static method init list like you want
    return list;
}
0 голосов
/ 17 июня 2009

Статика может быть нулевой, если она находится в другом потоке. В противном случае он всегда должен быть там, если вы не скажете ему что-то еще.

0 голосов
/ 17 июня 2009

Сборщик мусора не будет самостоятельно распоряжаться статическим классом. Сборщик мусора может стать активным, только если нет ссылки на класс. Пока вы можете вызывать сам класс, есть ссылка. Также вы не можете точно сказать, когда сборщик мусора становится активным. Он работает как некое задание в фоновом режиме.

Я бы порекомендовал вам добавить несколько сообщений трассировки отладки в ваш статический класс, чтобы вы могли видеть, когда он вызывается. Должны быть некоторые побочные эффекты, изменяющие ваш ArrayList во время выполнения.

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