Los métodos estáticos (de hecho, todos los métodos) y las variables estáticas se almacenan en la PermGen
sección del montón, ya que son parte de los datos de reflexión (datos relacionados con la clase, no relacionados con la instancia).
Actualización para aclaraciones :
Tenga en cuenta que solo las variables y sus valores técnicos (primitivas o referencias) se almacenan en el espacio de PermGen.
Si su variable estática es una referencia a un objeto, ese objeto en sí se almacena en las secciones normales del montón (generación joven / vieja o espacio de supervivientes). Esos objetos (a menos que sean objetos internos como clases, etc.) no se almacenan en el espacio de PermGen.
Ejemplo:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
Una palabra sobre la recolección de basura:
No , no depender finalize()
ya que no está garantizado para funcionar. Depende totalmente de la JVM decidir cuándo ejecutar el recolector de basura y qué recolectar, incluso si un objeto es elegible para la recolección de basura.
Por supuesto, puede establecer una variable estática en nula y, por lo tanto, eliminar la referencia al objeto en el montón, pero eso no significa que el recolector de basura lo recopile (incluso si no hay más referencias).
Además, finalize()
se ejecuta solo una vez, por lo que debe asegurarse de que no genere excepciones o evite que se recopile el objeto. Si detiene la finalización a través de alguna excepción, finalize()
no se invocará en el mismo objeto por segunda vez.
Una nota final : cómo se almacenan el código, los datos en tiempo de ejecución, etc., depende de la JVM que se utilice, es decir, HotSpot podría hacerlo de manera diferente a JRockit y esto podría incluso diferir entre versiones de la misma JVM. Lo anterior se basa en HotSpot para Java 5 y 6 (esos son básicamente los mismos) ya que al momento de responder diría que la mayoría de la gente usa esos JVM. Debido a cambios importantes en el modelo de memoria a partir de Java 8, las declaraciones anteriores pueden no ser ciertas para Java 8 HotSpot, y no verifiqué los cambios de Java 7 HotSpot, así que supongo que lo anterior sigue siendo cierto para esa versión. pero no estoy seguro aquí.