Lo que hay que leer sobre Recolección de Basura en Java (2)

Blog

Posted on 10 Feb 2015 04:59

En esta entrega fracaso en el propósito de proponer los tres artículos sobre Tipos de Recolectores y Algoritmos, fue necesario ampliar el listado para cubrir tanto los conceptos genéricos como los detalles de las implementaciones en tres máquinas virtuales que son populares en entornos de producción, principalmente Oracle HotSpot e IBM.

Todos los autores logran con mayor o menor éxito explicar los mecanismos de la JVM para recuperar memoria. Pero es definitivamente un tema complejo, existen muchos conceptos generales sobre recolectores seriales, paralelos y concurrentes que ya tienen una cantidad importante de teoría; luego viene entender las implementaciones de cada proveedor y como resuelven los problemas más comunes y complejos: el stop-the-world y la fase compaction.

Antes de empezar esta segunda parte, es importante que la primera (http://carloszuluaga.wikidot.com/blog:003-recursos-recoleccion-de-basura) haya dejado claros conceptos transversales para todas las máquinas virtuales comerciales y libres, algunos destacados son:

  • Static Compiler / Dynamic Compiler
  • Garbage Collection
  • Stop the world
  • Young Generation / Old Generation
  • Survivors
  • ¿Qué objetos puede recoger un recolector?
  • Minor Collection
  • Full Collection

Si alguno de estos términos no es familiar, recomiendo dar un repaso a los artículos anteriores. Las siguientes recomendaciones empiezan a ser más complejas y quizá sea necesario estudiar dos o tres veces alguno de los artículos como yo mismo he tenido que hacerlo.

Tipos de recolectores y algoritmos

jsgct_dt_006_prm_gn_sz.png

Los siguientes recursos explican con detalle como funciona la recolección de basura en el mundo práctico y como los conceptos se combinan con el propósito de lograr recolecciones que no impacten de manera significativa el rendimiento de las aplicaciones, en algunos casos de manera exitosa, en otros no.

Las primeras dos recomendaciones son un tanto genéricas e imprescindibles; a partir de la tercera, se explican aspectos específicos sobre las implementaciones en las JVMs comerciales más populares: HotSpot, IBM y la JVM de Azul Systems.
Descarté JRockit porque desapareció desde el JDK 7 al integrarse con HotSpot y OpenJDK por qué no tengo ningún tipo de experiencia con esta distribución.

Casi todos los artículos y vídeos presentan la misma teoría aprendida en la sección de conceptos básicos, así que se puede decidir saltar las secciones o repetirlas para reforzar los elementos que aún no sean claros.

1. Understanding Java Garbage Collection and What You Can Do about It
http://www.infoq.com/presentations/Understanding-Java-Garbage-Collection
Gil Tiene es quien probablemente hace las presentaciones más completas y técnicas sobre recolección de basura; esta vez hace una gran presentación, la mejor que he visto sobre el Garbage Collector en Java. Comienza por los conceptos más básicos y se sumerge en todos los mecanismos, la complejidad y los retos que tienen los recolectores de basura. Tene, también es uno de los creadores de Zing, una JVM que se diferencia por su recolector C4, que clama eliminar las pausas de recolección en heaps muy grandes y en cuyas aplicaciones la baja latencia sea uno de sus requerimientos principales.
Un elemento interesante de esta presentación, es la sección donde desmitifica algunas creencias erradas sobre la recolección de basura. Aproximadamente en el minuto 12 - 13 (Most of what People seem to “know” about Garbage Collection is wrong).
Hay que tranquilizarse un poco y no juzgar la presentación por su uso indiscriminado de Comic Sans ;-).

2. Choose the right garbage collector for your application needs
http://www.javaworld.com/article/2078645/java-se/jvm-performance-optimization-part-3-garbage-collection.html?null
El tercer artículo de la serie de Eva Andreasson, expone conceptos más completos y complejos sobre la recolección de basura en la JVM; explica los tipos de colectores, diferentes algoritmos, fases de la recolección, y algunas de las implementaciones en las distribuciones comerciales de la máquina virtual, entre otros. Explica uno de los aspectos fundamentales para las aplicaciones web transaccionales: la estructura de la recolección generacional.

Recolección en Oracle HotSpot

3. Java SE 6 HotSpot Virtual Machine Garbage Collection Tuning
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
Este es un artículo muy completo sobre la recolección de basura en la JVM HotSpot 6, cuyos conceptos aplican de igual forma para la versión 7.
Es cierto que la JVM está en su versión 8 con nuevos algoritmos y técnicas de recolección por defecto, pero aún es común encontrar la versión 6 en entornos de producción y más aún la 7; seguro esto será así por un tiempo por qué ya sabemos que pasar de una versión a otra es una tarea compleja y costosa, por más que la 7 haya llegado al End of Life (EOL).

4. Java 8 Garbage Collection Tuning Guide
La guía de tuning de HotSpot versión 8 es extensa, tanto como la teoría de recolección de basura. En este caso mi recomendación como lectura obligada son las tres primeras secciones de introducción y los demás de acuerdo a las necesidades o el colector seleccionado si se está analizando una aplicación específica.

Secciones de Introducción
4.1 Generations

http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/generations.html
Esta parte de la guía explica la estructura de memoria en HotSpot 8 que es igual a las distribuciones para algoritmos generacionales que se han explicado en artículos anteriores, sin embargo tiene un pequeño detalle que lo hace más interesante: cubre brevemente el análisis de los parámetros y contenido del Garbage Collector.

4.2 Sizing the Generations
http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html

Este es un primer acercamiento a la puesta a punto, hay recomendaciones para configurar el tamaño del heap y valores para algunos parámetros de inicio.

4.3 Available Collectors
http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collect
Nombra los tipos de recolectores disponibles en HotSpot y las consideraciones para seleccionar uno adecuado.

4.4 Recolectores y Algoritmos Detallados
El recolector paralelo: http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html
Recolector Concurrent Mark Sweep (CMS): http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html

4.5 El recolector Garbage First (G1GC)

Figure2.JPG

Este colector se introdujo por primera vez en la distribución de HotSpot 1.7.0_04.
G1GC es el cambio más importante de los últimos años en cuanto a la recolección de basura, tiene una distribución de memoria diferente al igual que las recolecciones menores y mayores.

5. Recolección en IBM JVM

Figure_03_Final.gif

5.1 Garbage Collection in WebSphere Application Server V8, Part 1
http://www.ibm.com/developerworks/websphere/techjournal/1106_bailey/1106_bailey.html
Contiene un resumen sobre los algoritmos de recolección para la JVM de IBM en su versión 8, que en su mayoría aplican para versiones anteriores. Como siempre es importante tener disponible la documentación de referencia para conocer parámetros de inicio y recomendaciones precisas para la versión con que se esté trabajando.

5.2 Garbage Collection in WebSphere Application Server V8, Part 2
http://www.ibm.com/developerworks/websphere/techjournal/1108_sciampacone/1108_sciampacone.html
Al igual que Oracle con JRockit y HotSpot, IBM ha visto limitada la escalabilidad de la JVM a causa de la recolección de basura.
En este artículo se presenta el nuevo algoritmo Balanced Garbage Collection como una nueva opción (similar a lo que representa G1 en HotSpot). Incluye una descripción detallada de su funcionamiento y recomendaciones para la puesta a punto.

6. Recolección en Zing

C4 Garbage Collection for low-latency Java applications
http://www.javaworld.com/article/2078661/java-concurrency/jvm-performance-optimization--part-4--c4-garbage-collection-for-low-latency-java-ap.html
La siguiente parte de la serie expone de manera básica el funcionamiento del algoritmo C4 y las ventajas de evitar el temido stop-the-world. No es una explicación detallada, pero supongo que Azul Systems tampoco pretende revelar todos los detalles de su Máquina Virtual.
Al final compara de manera aún más breve, C4 con los las recolecciones generacionales de Garbage First (G1 de Oracle) e IBM Balanced Garbage Collection.

7. Material adicional

Los artículos anteriores se pueden complementar con las guías formales de parámetros de inicio de las máquinas virtuales, es importante tener al menos los enlaces para que llegado el caso sepamos que parámetros aplican para versiones específicas.

Parámetros de inicio JVM 7:
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Parámetros de inicio para JVM 8:
Windows: http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
Linux, Unix, Mac: http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html


Leave a comment

Si no se indica lo contrario, el contenido de esta página se ofrece bajo Creative Commons Attribution-ShareAlike 3.0 License