Recursos para entender la recolección de basura en Java (1)

Blog

Posted on 05 Feb 2015 05:28

trash%20can.jpg

Entender correctamente los conceptos de recolección de basura en Java es una tarea ardua, desde hace varias semanas estoy investigando el asunto de manera meticulosa y no sólo es algo complejo, la red también está invadida de artículos inexactos con teorías y recomendaciones para mejorar el rendimiento, que poco o ningún efecto van a tener en un entorno de producción.

Me he puesto entonces la tarea de recolectar al menos 3 artículos por cada uno de los aspectos que considero fundamentales para comprender el proceso de recolección de basura optimización de aplicaciones que corren sobre una Java Virtual Machine:

  • Conceptos Básicos
  • Tipos de Recolectores y Algoritmos
  • Recolección de Basura en Acción
  • Configuración y Optimización

Conceptos básicos
Usualmente sabemos que la JVM tiene un proceso encargado de la recolección de basura y que en general, no tenemos que preocuparnos por la recuperación de la memoria que ya no está usando la aplicación (al contrario de los tiempos de C y C++). Sin embargo, los conceptos que tenemos son tremendamente básicos y como dice sabiamente Gil Tene en una de sus presentaciones, casi todo lo que creemos saber sobre recolección de basura, es falso.

Así que, primero debemos conocer las respuestas a las preguntas más elementales como: ¿Cuándo se ejecuta el recolector de basura? ¿Cuándo recolecta los objetos que ya no uso? ¿Qué objetos recolecta? ¿Es probable que elimine un objeto que aún estoy usando? ¿Es posible alterar el funcionamiento de un recolector? ¿Es recomendable hacerlo?

Así que los primeros recursos que voy a recomendar apuntan principalmente a eso, a preparar las bases para sumergirnos en lecturas o material más profundo sobre el tema.

1. Java Performance for Absolute Beginners
http://www.javaworld.com/article/2078623/core-java/jvm-performance-optimization-part-1-a-jvm-technology-primer.html

Eva Andreasson, quien trabajó en el equipo de desarrollo de JRockit y tiene un amplio recorrido en el mundo del performance tuning en Java, expone con claridad y detalle a la pregunta ¿Cuál es la estructura de la Java Virtual Machine? ¿Cómo funciona? Otra lectura básica para entender de manera global todo lo que implica correr una aplicación dentro de una máquina virtual.
Este es el primero de una serie de 5 artículos publicados y que incluiré dentro de las secciones a las que creo que pertenece cada uno.

2. Use the Right Java Compiler for your Java Application
http://www.javaworld.com/article/2078635/enterprise-middleware/jvm-performance-optimization-part-2-compilers.html

En el segundo artículo de la serie, Eva Andreasson nos introduce en el mundo de los compiladores, principalmente los que se ejecutan cuando el bytecode se carga en la JVM. También propone algunas recomendaciones a la hora de seleccionar uno para nuestra aplicación.

3. Java Garbage Collection Distilled
http://mechanical-sympathy.blogspot.com/2013/07/java-garbage-collection-distilled.html
Martin Thompson, uno de los especialistas más reconocidos en el mundo del rendimiento y optimización, hace un artículo muy completo sobre la recolección de basura en Java, recorriendo todos los conceptos y mecanismos.

4. How do objects become eligible for garbage collection?
http://www.thejavageek.com/2013/06/22/how-do-objects-become-eligible-for-garbage-collection/
Un brevísimo artículo comparado con los tres siguientes, sin embargo es importante aclarar un aspecto básico que suele ser pasado por alto o se asume como entendido: ¿Cuándo puede ser recolectado un objeto? Este es un artículo sencillo, donde con unas pocas líneas de código se explica con claridad el funcionamiento de las referencias e incluso las dependencias entre objetos.

Puede ser frustrante que todo el material sea en inglés, pero este no parece ser un tema muy popular y el contenido al que tenemos acceso usualmente fue creado un par de años atrás (aunque sigue siendo vigente) y en español existe muy poco material relevante.


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