2009-06-17 1 views
5

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

Это сработало хорошо, но теперь, в какой-то момент, когда я ожидаю получить ArrayList, все, что я получаю, это «null».

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

+3

Я знаю, что глобальные переменные плохо. – Ankur

+1

Что такое «статический класс»? Вы имеете в виду класс со статическими переменными или вложенный внутренний класс? – skaffman

+0

Извините, вы правы. Класс со статическими переменными и методами – Ankur

ответ

2

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

+0

Сам ArrayList – Ankur

9

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

public class Global { 

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

} 

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

Global.data.add("foo"); 

, но не:

Global.data = null; 
+1

Попробуйте это, хороший совет. +1 –

+0

Или установите контрольную точку в отладчике для запуска, если для переменной всегда установлено значение null. Дает вам удобную stacktrace и все =) – mikek

+1

Это не статический класс. Это класс, который включает статическую переменную, которая не то же самое. – UncleO

0

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

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

3

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

Как вы сами себя признаете, так что null может быть присвоено переменной в одной или нескольких из этих разных точек. :)

0

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

3

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

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

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

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

1

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

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

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

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

+0

вопрос был неправильным – dfa

2

Сбор мусора для классов происходит, если его загрузчик классов получает сбор мусора. См. Например, this question. В более ранней Java (я думаю, в версии 1.2) было определенное время, когда статические поля не рассматривались GC, и много разгрузочных/перезагружаемых классов вызывали пустые поля.

+0

1.0/1.1 имел ошибку, где классы могли быть мусором, собранным с помощью класса загрузчика классов. –

3

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

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

Ответ: Когда ваше приложение выходит.

+0

На самом деле это может произойти, когда класс больше не используется. Хотя это обычно происходит только при очистке загрузчика классов. ;) –

0

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

private static List<T> list; 


public static List<T> getList() { 
    if(list==null) 
     initList(); //private static method init list like you want 
    return list; 
}