definicion - textarea java propiedades
¿Cómo se divide el grupo de memoria java? (4)
Actualmente estoy monitoreando una aplicación Java con jconsole. La pestaña de memoria te permite elegir entre:
Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”
Cuál es la diferencia entre ellos ?
Memoria de pila
La memoria de almacenamiento dinámico es el área de datos de tiempo de ejecución desde la cual la VM de Java asigna memoria para todas las instancias y matrices de clase. El montón puede ser de un tamaño fijo o variable. El recolector de basura es un sistema automático de administración de memoria que reclama memoria de pila para objetos.
Eden Space : el grupo desde el cual la memoria se asigna inicialmente para la mayoría de los objetos.
Espacio de sobreviviente : el grupo que contiene objetos que han sobrevivido a la recolección de basura del espacio de Eden.
Generación de antigüedad o generación anterior : la agrupación que contiene objetos que han existido durante algún tiempo en el espacio de sobrevivientes.
Memoria no de pila
La memoria que no es de pila incluye un área de método compartida entre todos los subprocesos y la memoria requerida para el procesamiento interno u optimización para la máquina virtual Java. Almacena estructuras por clase, como una agrupación constante de tiempo de ejecución, datos de campo y método, y el código para métodos y constructores. El área del método es parte lógica del montón pero, dependiendo de la implementación, una máquina virtual Java no puede recolectar basura ni compactarla. Al igual que la memoria de almacenamiento dinámico, el área del método puede ser de un tamaño fijo o variable. La memoria para el área de método no necesita ser contigua.
Generación permanente : la agrupación que contiene todos los datos reflexivos de la propia máquina virtual, como los objetos de clase y método. Con las máquinas virtuales Java que utilizan el intercambio de datos de clase, esta generación se divide en áreas de solo lectura y de lectura y escritura.
Caché de código : La máquina virtual de HotSpot Java también incluye un caché de código, que contiene la memoria que se utiliza para la compilación y el almacenamiento de código nativo.
Con Java8, la región sin almacenamiento dinámico ya no contiene PermGen, pero Metaspace, que es un cambio importante en Java8, se supone que se deshace de los errores de falta de memoria con Java, ya que el tamaño del metaspacio se puede aumentar según el espacio requerido por jvm para los datos de clase.
La nueva palabra clave asigna memoria en el montón de Java. El montón es el grupo principal de memoria, accesible a toda la aplicación. Si no hay suficiente memoria disponible para asignar para ese objeto, la JVM intenta recuperar algo de memoria del montón con una recolección de basura. Si aún no puede obtener suficiente memoria, se lanza un OutOfMemoryError y la JVM sale.
El montón se divide en varias secciones diferentes, llamadas generaciones. A medida que los objetos sobreviven a más recolecciones de basura, son promovidos a diferentes generaciones. Las generaciones mayores no son recolectadas con tanta frecuencia. Debido a que estos objetos ya han demostrado tener una vida más larga, es menos probable que se recojan de basura.
Cuando los objetos se construyen por primera vez, se asignan en el espacio del Edén. Si sobreviven a una recolección de basura, se promocionan a Survivor Space, y si viven allí el tiempo suficiente, se asignan a la generación de tenencia. Esta generación de basura es recolectada con mucha menos frecuencia.
También hay una cuarta generación, llamada Generación Permanente, o PermGen. Los objetos que residen aquí no son elegibles para la recolección de basura, y generalmente contienen un estado inmutable necesario para que se ejecute la JVM, como las definiciones de clase y el conjunto de constantes de cadena. Tenga en cuenta que el espacio PermGen se planea eliminar de Java 8 y se reemplazará con un nuevo espacio llamado Metaspace, que se guardará en la memoria nativa. referencia : http://www.programcreek.com/2013/04/jvm-run-time-data-areas/
Java Heap Memory es parte de la memoria asignada a JVM por el sistema operativo.
Los objetos residen en un área llamada el montón. El montón se crea cuando se inicia la JVM y puede aumentar o disminuir su tamaño mientras se ejecuta la aplicación. Cuando el montón se llena, la basura se recoge.
Puede encontrar más detalles sobre Eden Space, Survivor Space, Tenured Space y Permanent Generation en la siguiente pregunta SE:
Joven, tenencia y generación permanente.
PermGen ha sido reemplazado con Metaspace desde el lanzamiento de Java 8.
Respecto a tus consultas:
- Eden Space, Survivor Space, Tenured Space son parte de la memoria de almacenamiento dinámico
- Metaspace y Code Cache son parte de la memoria no de pila.
Codecache: la máquina virtual Java (JVM) genera un código nativo y lo almacena en un área de memoria llamada codecache. La JVM genera código nativo por diversos motivos, incluidos el bucle de intérprete generado dinámicamente, los apéndices de la interfaz nativa de Java (JNI) y los métodos de Java compilados en el código nativo por el compilador Just-in-time (JIT). El JIT es, con mucho, el mayor usuario del codecache.