Подтвердить что ты не робот

Открыты ли статические поля для сбора мусора?

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

class MyUtils {
   private static MyObject myObject = new MyObject();
   /*package*/static boolean doStuff(Params... params) {
       // do stuff with myObject and params...
   }
}

будет ли myObject собирать мусор, когда он больше не используется, или он будет зависеть от срока службы программы?

4b9b3361

Ответ 1

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

Посмотрите JLS Раздел 12.7 Разгрузка классов и интерфейсов

Класс или интерфейс могут быть выгружены тогда и только тогда, когда его определяющий класс погрузчик может быть утилизирован мусором сборщик [...] Классы и интерфейсы загруженный загрузчиком загрузки, может не разгружаться.

Ответ 2

Статические переменные ссылаются объектами класса, на которые ссылается ClassLoaders, - если только ClassLoader каким-то образом не качает Class (если это возможно), либо сам ClassLoader становится пригодным для сбора (скорее, подумайте о разгрузке webapps) статический переменные (или, вернее, объекты, которые они ссылаются) не будут собраны.

Ответ 3

Если вы хотите, чтобы временный объект использовался для статической инициализации, а затем удалялся, вы можете использовать статический блок инициализации, например

class MyUtils {
   static
   {
      MyObject myObject = new MyObject();
      doStuff(myObject, params);
   }

   static boolean doStuff(MyObject myObject, Params... params) {
       // do stuff with myObject and params...
   }
}

поскольку блок статического инициализатора является специальным типом статического метода, myObject является локальной переменной и может быть мусором, собранным после завершения выполнения блока.

Ответ 4

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

Таким образом, объект за статической ссылкой "myObject" может быть собран в мусор, если вы разыщите его с помощью

myObject = null;

и других ссылок на этот объект нет.

Однако статические ссылки и переменные остаются за время жизни вашей программы.

Ответ 5

Я думаю, этот отвечает на ваш вопрос - в основном, если только класс не приходит из специального загрузчика классов и выгружает класс.

Ответ 6

Ключевым моментом здесь является сборка экземпляров класса "Мусор", т.е. "Объекты". Класс ClassLoader - это, по сути, объект. Поэтому, если объект Classloader не собирает мусор, любые ссылки на них, хранящиеся в куче (т.е. статические вещи), почти никогда не будут собираться мусором. Исключением является String pool.

Итак, прежде чем вы вдруг решите сделать private static MyGiantClass myGiantObject = new MyGiantClass() Подумайте дважды, поскольку я усвоил этот трудный путь.