Los métodos estáticos son solo métodos, no se almacenan en el montón, simplemente no usan el parámetro "this".
Las variables estáticas sirven como "raíces" para el GC. Como resultado, a menos que los establezca explícitamente como nulos, vivirán mientras viva el programa, y así todo se puede acceder desde ellos.
Una situación solo se considera una pérdida de memoria si desea que la memoria se vuelva gratuita y no se vuelva gratuita. Si pretendes que tu variable estática contenga una referencia a un objeto durante parte del tiempo, y te olvidas de establecerlo como nulo cuando hayas terminado con ese objeto, es probable que termines con una fuga. Sin embargo, si lo coloca en la variable estática y tiene la intención de que permanezca allí mientras se ejecuta el programa, entonces definitivamente no es una fuga, es más probable que sea un "singleton permanente". Si el objeto se recuperó mientras usted quería que aún existiera, eso hubiera sido muy malo.
En cuanto a su pregunta sobre el montón: Todos los objetos en Java existen ya sea en el montón o en la pila. Los objetos se crean en el montón con el nuevo operador. A continuación, se les adjunta una referencia. Si la referencia se vuelve nula o cae fuera del alcance (por ejemplo, al final del bloque), el GC se da cuenta de que no hay forma de volver a alcanzar ese objeto nunca más y lo reclama. Si su referencia está en una variable estática, nunca se saldrá del alcance, pero puede establecerla en nulo o en otro objeto.
IIRC los campos estáticos serán GCed tan pronto como la clase que los declara es GCed.Si la instancia elast de la clase ha desaparecido, la declaración de clase irá y los campos estáticos con ella. – ordnungswidrig
No estoy seguro de si @ o11rig es completamente exacto, pero creo que el GC puede recopilar estadísticas para las clases que no tienen miembros bajo ciertas circunstancias. He escuchado esto de un par de fuentes, pero nunca escuché una explicación exacta. –
Ligera objeción: todos los objetos Java * viven en el montón. Las referencias * y las primitivas de Object * se pueden almacenar en la pila si son locales del método que se está ejecutando actualmente, y se almacenan en el montón de otro modo. (Excepto en cualquier JVM moderna con un JIT, donde el optimizador de JIT puede colocar objetos donde quiera, siempre y cuando * actúe * como si los objetos estuvieran en el montón). Y podría argumentarse que los métodos estáticos - o , al menos, el bytecode de Java que los implementa, también vive en el montón, como parte del objeto Class que representa la clase en la que se definieron. –