¿Cuál es el lugar de memoria real para las variables estáticas?

La variable estática se asigna para la duración total de la ejecución del progtwig, por lo que ni la stack ni el montón son convenientes para ella. Entonces, ¿dónde está? Debe haber un lugar donde se carga?

Los campos estáticos se inicializan cuando se carga una clase y se descartan cuando se descarga el cargador de clases para esa clase. Se pueden limpiar, incluso duplicar en otro cargador de clases.

Para aplicaciones como las que usa OSGi, las variables estáticas que no viven durante la vida útil de la aplicación se pueden volver a cargar muchas veces.

Cómo se implementa esto puede ser dependiente de JVM pero la JVM de Sun / Oracle crea un “objeto” para contener los campos estáticos para una clase. Se puede acceder a este objeto a través de la clase Inseguro, que también se puede usar para examinar estos campos de “objetos”.

Tenemos 3 segmentos en nuestra memoria:

  1. Stack Segment: contiene variables locales y variables de referencia (variables que contienen la dirección de un objeto en el montón).

  2. Heap Segment: contiene todos los objetos creados en tiempo de ejecución, solo los objetos más sus atributos de objeto (variables de instancia).

  3. Segmento de código: el segmento donde residen los bytecodes de Java comstackdos reales cuando se cargan. Los miembros estáticos (variables o métodos) se denominan miembros de clase, lo que significa que residen donde reside la clase (código de bytes), que se encuentra en el segmento de código.

La variable estática se asigna para la duración total de la ejecución del progtwig, por lo que ni la stack ni el montón son convenientes para ella.

De hecho, las ttwigs estáticas (es decir, las ttwigs que contienen las variables estáticas) se asignan desde el montón.

Y no existen necesariamente durante la ejecución del progtwig. Por ejemplo, los marcos estáticos para las clases que se cargan dinámicamente pueden recostackrse basura si no se puede acceder al cargador de clases principal, todas las clases y todas las instancias.

De http://www.daniweb.com/software-development/java/threads/34695 :

La memoria de la variable estática se asigna al inicio del progtwig, en la memoria normal, en lugar de la stack (memoria reservada específicamente para el progtwig). la ventaja de esto es que hace que su variable o procedimiento sea totalmente constante, y no puede cambiar accidentalmente el valor. la desventaja de esto es que la memoria no se desasigna hasta que finaliza el progtwig. Nunca he escuchado nada que los valores estáticos tomen más memoria que si se declaran regularmente, pero su uso de memoria es constante.

De las cinco áreas de memoria que utiliza JVM, los campos estáticos tienen memoria asignada en el área de clase (parte de PremGen) cuando la clase es cargada por el cargador de clases de aplicación durante la fase de preparación y carga. Si el campo es primitivo, el valor se almacena en el área de clase y si es de Tipo de objeto (se utiliza un operador nuevo), se almacena en stack, pero la referencia se asigna a la variable de campo estático asignada en el área de clase. Cuando la clase está descargada, la memoria para ese campo estático también está disponible para que GC la recoja.

Si el campo es final también, es decir, estático final, se mantiene en un grupo constante debajo del área de clase.