works how example collector check java garbage-collection jvm heap-memory

java - how - Generación joven, sostenida y permanente



java heap space (4)

Estoy confundido con la generación Heap, Young, Tenured y Perm.

¿Alguien podría explicar?


Aquí hay otro artículo excelente (aunque largo) sobre cómo ajustar / ajustar el tamaño de los parámetros de su GC, lo que puede ayudarlo a comprender aún más:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/

Una lectura muy útil si tiene problemas con el GC y necesita saber cómo leer los registros del GC, o necesita comprender cómo funciona el GC recopilador actual.

Si desea conectar la monitorización remota de un sistema en funcionamiento para ver el uso de memoria en tiempo real y las ejecuciones de GC, revise esta herramienta:

http://java.sun.com/performance/jvmstat/visualgc.html


El recolector de basura de Java se conoce como un colector de basura generacional . Los objetos en una aplicación viven por períodos variables dependiendo de dónde se crean y cómo se usan. La idea clave aquí es que el uso de diferentes estrategias de recolección de basura para objetos de vida corta y de larga duración permite que el GC se optimice específicamente para cada caso.

En términos generales, a medida que los objetos "sobreviven" a las repetidas recolecciones de basura en la Generación Joven , se los migra a la Generación Permanente . La Generación permanente es un caso especial, contiene objetos, que la JVM necesita, que no están necesariamente representados en su programa, por ejemplo, objetos que representan clases y métodos.

Dado que Young Generation generalmente contiene mucha basura, está optimizado para deshacerse de una gran cantidad de objetos no utilizados a la vez. The Tenured Generation ya que contiene objetos de mayor duración está optimizado para una recolección rápida de basura sin desperdiciar mucha memoria.

Con las mejoras en la tecnología de recolección de basura, los detalles se han vuelto bastante complejos y varían dependiendo de su JVM y de cómo se haya configurado. Debería leer la documentation de la JVM específica que está utilizando si necesita saber exactamente qué está sucediendo.

Dicho esto, hay una disposición histórica simple que aún es útil a nivel conceptual. Históricamente, la generación joven sería un coleccionista de copias y la generación dependiente sería un coleccionista de marcas y barridos . Un recolector de copias no paga esencialmente el costo de la CPU para deshacerse de la basura, la mayor parte del costo es para mantener los objetos en vivo, el precio de esta eficiencia es un mayor uso de la memoria. Un colector de marcas y barridos paga algunos costos de CPU para objetos en uso y no utilizados, pero utiliza la memoria de manera más eficiente.


Todos los objetos en el montón sobreviven serán referenciados. Cuando no son más, el recolector de basura (GC) recuperará su memoria.

PermGen, Young y Tenured son diferentes clasificaciones de objetos (o espacios en el montón donde pueden estar).

PermGen: estos objetos estarán siempre allí, no son basura. Las clases de objetos están allí, cadenas internas, etc. No sé si hay un GC allí (cuando el sistema descarga clases ... pero no es algo normal)

Joven: cuando se crea un objeto, está aquí.

Tenured: un objeto va a esta clasificación / categoría cuando sobrevive N pasa GC (sobrevivir = GC pasa, pero se hace referencia a este objeto por lo que no puede recuperarse).

Dependiendo del GC utilizado y alguna parametrización, GC pasa más o menos a menudo.

Entonces, la recolección de basura puede tener diferentes enfoques para manejar objetos en el montón. Esta clasificación de objetos ayuda a hacerlo.


Java Heap Memory es parte de la memoria asignada a JVM por el sistema operativo. Cada vez que creamos objetos, se crean dentro de Heap en Java .

El espacio de Java Heap se divide en tres regiones o generación en aras de la recolección de basura llamada Young Generation, Old or tenured Generation y Permanent Generation . La generación permanente es basura recolectada durante el gc completo en el punto de acceso JVM

The Young Generation es donde todos los objetos nuevos son asignados y envejecidos. Cuando la generación joven se llena, esto causa una pequeña recolección de basura. Una generación joven llena de objetos muertos se recoge muy rápidamente. Algunos objetos sobrevivientes son envejecidos y eventualmente pasan a la generación anterior.

The Old Generation se usa para almacenar objetos supervivientes largos. Normalmente, se establece un umbral para el objeto de generación joven y cuando se alcanza esa edad, el objeto se mueve a la generación anterior. Finalmente, la generación anterior debe ser recolectada. Este evento se llama una gran colección de basura.

La generación permanente contiene los metadatos requeridos por la JVM para describir las clases y los métodos utilizados en la aplicación. La generación permanente está poblada por la JVM en tiempo de ejecución en función de las clases que utiliza la aplicación.

PermGen ha sido reemplazado por Metaspace desde la versión de Java 8. Los parámetros PermSize y MaxPermSize serán ignorados ahora. Eche un vistazo a este artículo dzone de Pierre - Hugues Charbonneau para entender sobre Metaspace .

Fuente de la imagen: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

Consulte el mismo artículo para más detalles.