Учитывая гипотетический служебный класс, который используется только при настройке программы:
class MyUtils {
private static MyObject myObject = new MyObject();
/*package*/static boolean doStuff(Params... params) {
// do stuff with myObject and params...
}
}
будет ли myObject сборщиком мусора, когда он больше не используется, или он останется на всю жизнь программы?
java
static
garbage-collection
static-members
Майкл Дирдеафф
источник
источник
На статические переменные ссылаются объекты класса, на которые ссылается ClassLoaders -so, если либо ClassLoader каким-то образом не отбрасывает класс (если это даже возможно), либо сам ClassLoader становится подходящим для сбора (более вероятно - подумайте о выгрузке веб-приложений) статических переменных (или скорее объекты, на которые они ссылаются) не будут собраны.
источник
Class
объекты, не содержащие статических переменных, ссылается их загрузчик классов?Если вы хотите, чтобы временный объект использовался для статической инициализации, а затем удалялся, вы можете использовать блок статического инициализатора, например
class MyUtils { static { MyObject myObject = new MyObject(); doStuff(myObject, params); } static boolean doStuff(MyObject myObject, Params... params) { // do stuff with myObject and params... } }
поскольку блок статического инициализатора - это особый вид статического метода, myObject - это локальная переменная, которая может быть собрана в мусор после завершения выполнения блока.
источник
myObject - это ссылка, а не объект . Объект автоматически собирается сборщиком мусора, если на него нет ссылок, потому что он недоступен.
Таким образом, объект за статической ссылкой «myObject» может быть удален сборщиком мусора, если разыменовать его с помощью
myObject = null;
и нет других ссылок на этот объект.
Однако статические ссылки и переменные остаются в течение всего срока службы вашей программы.
источник
null
в конецstatic block
- жизнеспособный вариант. Однако в моем случае время жизни объекта должно быть больше, чем у статического блока. Конец полезности объекта не был очень конкретным; поэтому мой вопрос об использовании сборщика мусора.Я думаю, что это ответ на ваш вопрос - в основном, нет, если класс не исходит из специального загрузчика классов, который выгружает класс.
источник
Ключевым моментом здесь является сборка мусора экземпляров класса, то есть объектов. Экземпляр ClassLoader, по сути, является объектом. Таким образом, если объект Classloader не является сборщиком мусора, любые ссылки на них, хранящиеся в куче (т.е. статический материал), почти никогда не будут собираться сборщиком мусора. Исключение составляет пул строк.
Поэтому, прежде чем вы вдруг решите сделать,
private static MyGiantClass myGiantObject = new MyGiantClass()
подумайте дважды, как я узнал на своем собственном опыте.источник