lunes, 4 de febrero de 2008

Tuning Java Virtual Machines (JVMs): Java Heap

Garbage collection es el proceso de la VM que recoloca objetos Java sin usar en la pila Java. La pila Java es donde están los objetos vivos de un programa java. Es un repositorio para objetos vivos, muertos y memoria libre. Cuando un objeto no puede ser referenciado por ningún puntero del programa en ejecución es considerado como basura

*El tamaño de la pila de la JVM determina con que frecuencia y cuanto tiempo empleará la VM realizando recolección de basura. Un ratio aceptable para la recolección de basura de una aplicación debería ajustarse después de analizar el tiempo y la frecuencia con que se realizan los GC.

*El objetivo de tunear el tamaño de la pila es minimizar la duración del GC, mientras maximizas el número de clientes que puede manejar en un momento dado.

En el Heap podemos distinguir 3 zonas:










  • New o Young Generation: Los objetos inicialmente se situan aqui
Eden = NewSize – ((NewSize / (SurvivorRatio + 2)) * 2)
From Space = (NewSize – Eden / 2)

To Space = (NewSize – Eden) / 2)


-XX:NewSize
-XX:MaxNewSize
-XX:NewRatio
-XX:SurvivorRatio
*
  • Old o Tenured Generation: Aqui encontraremos objetos con larga vida
*
-XX:OldSize -XX:MinHeapFreeRatio
* -XX:MaxHeapFreeRatio

  • Permanet Generation: Almacena clases de objetos
*
*
-XX:PermSize
-XX:MaxPermSize
* -Xnoclassgc

Un objeto es basura cuando no puede ser alcanzado (no tiene referencias fuertes) desde ningún punto del programa que se está ejecutando. El método más directo de recolección de basura es iterar sobre cada objeto alcanzable, y se asume que todos aquellos por los que no se pase son basura. Este enfoque tarda un tiempo proporcional al número de objetos vivos, lo que es prohibitivo para grandes aplicaciones que mantienen gran cantidad de objetos vivos.

Versiones recientes de la JVM incorporan una serie de diferentes algoritmos de recolección de basura que se combinan utilizando la recolección generacional. Mientras la recolección ordinaria examina cada objeto vivo en el heap, la recolección generacional aprovecha ciertas propiedades de las aplicaciones observadas empíricamente para evitar trabajo extra.


La recolección de basura se produce en cada generación cuando ésta se llena. Los objetos se sitúan en el edén y, debido a la mortalidad infantil, la mayoría muere ahí. Cuando el edén se llena se produce una recolección menor en la que algunos objetos supervivientes se mueven a una generación más vieja. Cuando las generaciones viejas se llenan se produce una recolección mayor que, generalmente, es mucho más lenta debido a que involucra a todos los objetos vivos.

Cuanto más tiempo sobreviva un objeto, más recolecciones pasarán sobre él, y el recolector de basura se volverá más lento. La recolección de basura será más eficiente haciendo que los objetos no sobrevivan a la primera recolección. Las aplicaciones pueden trastornar esta situación ideal con distribuciones de tiempo de vida inusuales o con generaciones de tamaño pequeño que causan recolecciones con demasiada frecuencia.

Existen varias técnicas para desarrollar Garbage Collection. Las más utilizadas son marcar y barrer (mark-and-sweep) y recolección por copia (copying collection).