Regístrate aquí
 

Inicio / Entendiendo SematicWebBuilder / Puesta punto de un JVM / Heap, Stack, PermGen (Memoria en un JVM)

Heap, Stack, PermGen (Memoria en un JVM)

El manejo de memoria en el JVM es uno de los puntos cruciales para el buen desempeño de una aplicación Java, la memoria que administra el JVM se divide en varios sectores de los cuales los mas importantes a considerar son:

 

Heap: El área de Heap almacena todos los objetos que se utilizan dentro del JVM, es la memoria principal y se divide a su vez, según el JVM que se use, en diversas áreas de trabajo. En el caso del JVM HotSpot de Oracle el Heap se divide en Eden, Survivors y Old; esta división tiene como objetivo facilitar la limpieza de la memoria por el Garbage Collector.

 

Eden es el área en donde se crean nuevos objetos, usualmente es cerca de una sexta parte de la memoria heap y cuando se llena el Garbage Collector ejecuta lo que se le conoce como una recolección parcial, los objetos que sobrevivan a esta recolección serán copiados a la siguiente área de memoria conocida como Survivor. los parámetros que sirven para ajustar el tamaño de Eden son: -XX:NewRatio, -XX:NewSize y - XX:MaxNewSize.

 

Los espacios Survivor sirven como un área de almacenamiento temporal mientras los objetos envejecen, el parámetro -XX:SurvivorRatio le indicará al JVM cuantas generaciones un objeto debe sobrevivir en los Survivor antes de ser promovido al área Old. Durante cada colección parcial los objetos en Survivor son evaluados para saber cuales han sobrevivido y en su caso se mueven a Old, si survivor se llenara los objetos mas antiguos se promoverán a Old aunque aún no hayan cumplido su periodo de envejecimiento.

 

Old es el área mas grande del heap, esta diseñado para mantener objetos que usualmente duran durante todo el ciclo de vida del JVM o que han sobrevivido al área de maduración (Eden - Survivor) cuando Old se llena el JVM detiene todos los threads en ejecución y busca todos los objetos que ya no están en uso dentro de Old, reorganiza los objetos dentro de Old y sólo entonces permite que el resto de los threads continúen su ejecución, a esta acción se le conoce como Stop-The-World Pause.

 

Los parámetros para determinar el tamaño del heap son -Xms y -Xmx; desde java 6 existe el parámetro -XX:+AggressiveHeap mediante el cual se le indica al JVM que haga su mejor esfuerzo por llegar a los valores óptimos de operación en la plataforma y con la aplicación que se está ejecutando.

 

PermGen es el área donde JVM almacena las clases que se cargan, por lo que en algunos servidores de aplicación será necesario incrementarla para que de cabida a las clases del Servidor de aplicación, SWB y las clases resultantes de los JSP que se incorporen a la instancia.