¿Están abiertos los campos estáticos para la recolección de basura?

Resuelto Michael Deardeuff asked hace 15 años • 6 respuestas

Dada una clase de utilidad hipotética que se usa sólo en la configuración del programa:

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

¿myObject será recolectado como basura cuando ya no se use, o permanecerá durante la vida útil del programa?

Michael Deardeuff avatar Jan 17 '09 16:01 Michael Deardeuff
Aceptado

No se pueden elegir variables estáticas para la recolección de basura mientras la clase está cargada. Se pueden recopilar cuando el cargador de clases respectivo (que fue responsable de cargar esta clase) se recolecta como basura.

Consulte la sección 12.7 de JLS, Descarga de clases e interfaces.

Una clase o interfaz se puede descargar si y solo si el recolector de basura puede reclamar el cargador de clases que lo define [...] Las clases e interfaces cargadas por el cargador de arranque no se pueden descargar.

bruno conde avatar Jan 17 '2009 09:01 bruno conde

myObject es una referencia y no un objeto . Un objeto se recolecta automáticamente como basura cuando ninguna referencia apunta a él porque es inalcanzable.

Entonces, también el objeto detrás de una referencia estática "myObject" puede ser recolectado como basura si lo eliminas con

myObject = null;

y no hay otras referencias a este objeto.

Sin embargo, las referencias y variables estáticas permanecen durante la vida útil de su programa.

Felix Keil avatar Jul 11 '2014 12:07 Felix Keil

Si desea utilizar un objeto temporal para la inicialización estática y luego eliminarlo, puede utilizar un bloque inicializador estático, por ejemplo

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

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

Dado que el bloque inicializador estático es un tipo especial de método estático, myObject es una variable local y se puede recolectar como basura una vez que el bloque termina de ejecutarse.

finnw avatar Jan 17 '2009 18:01 finnw

Creo que esto responde a tu pregunta: básicamente no, a menos que la clase provenga de un cargador de clases especial y eso descargue la clase.

Tom avatar Jan 17 '2009 09:01 Tom