¿Están abiertos los campos estáticos para la recolección de basura?
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?
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.
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.
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.
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.