Dada una clase de utilidad hipotética que se usa solo 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 se recolectará como basura cuando ya no se use, o se quedará durante la vida útil del programa?
java
static
garbage-collection
static-members
Michael Deardeuff
fuente
fuente
Las variables estáticas son referenciadas por objetos Class a los que hacen referencia ClassLoaders, por lo tanto, a menos que el ClassLoader descarte la clase de alguna manera (si eso es posible) o el ClassLoader mismo se vuelve elegible para la colección (más probablemente, piense en descargar aplicaciones web) las variables estáticas (o más bien, los objetos a los que hacen referencia) no se recopilarán.
fuente
Class
Su cargador de clases hace referencia a los objetos que no contienen variables estáticas?Si desea que un objeto temporal se utilice para la inicialización estática y luego se elimine, puede utilizar un bloque de inicialización estático, p. Ej.
dado que el bloque de inicializador estático es un tipo especial de método estático, myObject es una variable local y se puede recolectar basura después de que el bloque termine de ejecutarse.
fuente
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.
Así que también el objeto detrás de una referencia estática "myObject" puede ser recolectado como basura si lo desreferencia con
y no hay otras referencias a este objeto.
Sin embargo, las referencias y variables estáticas permanecen durante la vida útil de su programa.
fuente
null
final delstatic block
es una opción viable. En mi caso, sin embargo, la vida útil del objeto debía ser más larga que la del bloque estático. El fin de la utilidad del objeto no fue muy concreto; por eso mi pregunta sobre la utilización del recolector de basura.Creo que esto responde a su pregunta, básicamente no a menos que la clase provenga de un cargador de clases especial y eso descargue la clase.
fuente
La clave aquí es la recolección de basura de instancias de clase, es decir, objetos. La instancia de ClassLoader es, en esencia, un objeto. Entonces, si el objeto Classloader no se recolecta como basura, cualquier referencia de ellos almacenada en el montón (es decir, cosas estáticas) casi nunca será recolectada como basura. La excepción es el grupo de cadenas.
Entonces, antes de que de repente decida hacerlo,
private static MyGiantClass myGiantObject = new MyGiantClass()
piense dos veces, ya que he aprendido por las malas.fuente