jueves, diciembre 23, 2010

GC: Only the good die young

jueves, diciembre 23, 2010 por Martín


Una frase popular dentro del frikimundo de la Garbage Collection es "Only the good die young", que proviene además de una canción bastante popular de Billy Joel y que le viene que ni pintada.

Un poco de background para la frase. Todo esto depende de la máquina virtual utilizada, pero tomando como referencia Hotspot que es una máquina virtual generacional, tenemos que la memoria se divide en dos generaciónes: Young generation y Tenured generation. Cada una de estas zonas a su vez está dividida en otras zonas, pero esto lo vamos a obviar por razones de simplicidad.

La Young Generation es mucho más pequeña que la Tenured Generation. Por lo tanto, la recolección de basura ahí es mucho más rápida. Pero aún más importante, la recolección de basura en la Young Generation se hace constantemente y no requiere parar los diferentes threads de la máquina virtual de Java, mientras que normalmente (recordad, esto es una visión meramente pedagógica y simplificada) la recolección de basura en la Tenured Generation exige parar todos los threads de la máquina virtual.



Cuando creamos objetos en nuestros programas, éstos se van a parar a la Young Generation. Una vez que esta generación se llena se produce lo que se llama una Minor Garbage Collection que básicamente eliminará de memoria todos los objetos que hayan desaparecido y moverá los objetos vivos que queden en memoria a la Tenured Generation. Cuantos menos objetos vivos queden, menos trabajo tiene que hacer.

Partiendo de estos hechos llegamos al quiz de la frase "Only the good die young", o sólo los buenos mueren jóvenes. En una máquina virtual con un modelo de memoria generacional como el de Hotspot hay dos tipos de objetos que se comportan bien: aquellos que se crean y se destruyen rápidamente, los jóvenes, y aquellos que se crean y nunca desaparecen. Si uno de los requisitos para nuestras aplicaciones es que haya pocas recolecciones de basura (real-time, finanzas, trading, pagos, gran volumen de transacciones etc.), entonces debemos esforzarnos en crear objetos de corta duración. Objetos que simplemente vivan en la Young Generation y desaparezcan.

Con lo que realmente sufre la máquina virtual es con objetos que viven sólo lo suficiente para ser movidos a la Tenured Generation. Por dos razones: primero porque hay un coste asociado en moverlos de la Young a la Tenured, y segundo porque van ocupando espacio en la Tenured y una vez que ésta se llene no nos quedará más opción que realizar una Major Garbage Collection que dependiendo del tamaño del Heap puede realmente ser crítico.

Los objetos con un ciclo de vida corto simplemente desaparecen y no causan problemas. ¿Cuáles son estos objetos? Pues principalmente objetos creados en métodos. ¿Cuáles no lo son? Variables estáticas, variables de instancia en objetos de larga duración, objetos cuyo uso se encuentra desperdigado entre diferentes clases y servicios, etc. Un caso aparte son los objetos que nunca desaparecen, como las cachés. Estos objetos no son malos porque simplemente se moverán a la Tenured y ahí se quedarán para siempre, así que no causan mucho más problema.

La frase "Only the good die young" la he visto mencionada en este "Tenuring Policies for Generation-Based Storage Reclamation" y también aquí, pero muchos preferiréis el original:

comments

2 Respuestas a "GC: Only the good die young"
Alberto Vilches dijo...
19:46

Muy bueno, como siempre.


Martín dijo...
20:36

Sí. Billy Joel es muy bueno :D