El Java Garbage Collector es uno de los conceptos que mas cuesta entender a la gente cuando empieza a programar en Java. ¿Cómo funciona el Java Garbage Collector exactamente?. Java divide la memoria en dos bloques fundamentales , Young generation y Old generation.
En la zona de Young Generation se almacenan los objetos que se acaban de construir en el programa . Esta zona de memoria se divide en Eden Space ,Survivor Space (S0 y S1)
La zona de Eden es la zona en la que los objetos que acabamos de construir se almacenan.
Cuando el recolector de basura pasa , elimina todos los objetos que ya no dispongan de referencias en el Eden Space y los supervivientes los mueve al Survivor Space.
El recolector de basura volverá a pasar otra vez y si queda algún objeto superviviente en el Survivor Space S0 lo moverá al Survivor S1
Después de varias pasadas del recolector de basura los objetos que todavía están vivos en el Survivor Space dejan de ser considerados Young Generation y pasan a ser considerados Old Generation .
Java Garbage Collector Old Generation
¿Cómo funciona la zona de Old Generation?. Esta zona esta divivida en dos partes , la primera se denomina Tenured Generation y es donde los objetos que tienen un ciclo de vida largo se almacenan. La segunda zona se denomina Permanent Generation y es donde están cargadas las clases Java que la JVM necesita.
Así pues cuando nosotros tenemos objetos que han sobrevivido a varios garbage collectors pasan de el Survivor Generation Space a Tenured Generation Space.
Finalmente el recolector de basura también pasará por el Tenured Space para liberar objetos. Esta operación se realizará de una forma mucho más espaciada y cuando el espacio se encuentre practicamente lleno.
Para ampliar información:
Otros artículos relacionados :
Hola, interesante nota. Actualmente estamos haciendo analicis sobre el consumo de nuestra jvm ya que note que la limpieza del GC no esta trabajando correctamente. A medida que pasa el tiempo el consumo java aumenta y por mas que corra el GC no se esta realizando en su totalidad la depuración de memoria. La configuración actual es: -XX:+DisableExplicitGC -Xms3072M -Xmx6144M -XX:PermSize=256M -XX:MaxPermSize=512M Mediante un test descubrí que muchos de los objetos finalizan como PendingFinalizers y acompañado con la configuración que tenemos no se si esto forma parte del consumo excesivo y que tenemos que impide además que no se realice… Read more »
Es muy probable que tengas un pequeño memory leak que poco a poco te va consumiendo la memoria
Muchas gracias Cecilio, voy a realizar una lectura del heapdump a ver si encuentro uno.
suerte 🙂
Todo tu comentario es NULO cuando veo escrito “Analicis” y comentas que GC no funciona bien…
La teoría dice que java automáticamente libera la memoria, la realidad es que esto es mentira, solo tenemos que usar el administrador de tareas para comprobar que al entrar en distintas ventanas la memoria usada por la aplicación sigue y sigue creciendo y nunca libera nada.
Ojala fuera tan sencillo , la gestión del recolector de basura es compleja y no es suficiente con únicamente mirar la memoria de procesos 🙂
Hola muy interesante, tengo una duda recomendarías asignar null a las variables utilizadas en un método en el bloque finally con el fin que el garbage colector los elija más rápido para ser reciclados ?
no lo veo necesario en cuanto salgas del método los contadores de referencia se pondrán a cero y pasará el objeto a ser seleccionable por el recolector