Estoy tratando de entender cuáles son los conceptos de las generaciones jóvenes , viejas y permanentes en la terminología del montón de Java, y más específicamente las interacciones entre las tres generaciones.
Mis preguntas son:
- ¿Qué es la generación joven?
- ¿Qué es la vieja generación?
- ¿Qué es la generación permanente?
- ¿Cómo interactúan / se relacionan las tres generaciones entre sí?
Respuestas:
Esto parece un malentendido común. En la JVM de Oracle, la generación permanente no es parte del montón. Es un espacio separado para definiciones de clase y datos relacionados. En Java 6 y versiones anteriores, las cadenas internadas también se almacenaban en la generación permanente. En Java 7, las cadenas internadas se almacenan en el montón de objetos principal.
Aquí hay una buena publicación sobre generación permanente .
Me gustan las descripciones dadas para cada espacio en la guía de Oracle en JConsole :
Java utiliza la recolección de basura generacional. Esto significa que si tiene un objeto foo (que es una instancia de alguna clase), cuantos más eventos de recolección de basura sobreviva (si todavía hay referencias a él), más se promocionará. Comienza en la generación joven (que a su vez está dividida en múltiples espacios: Eden y Survivor) y eventualmente terminaría en la generación con tenencia si sobreviviera lo suficiente.
fuente
Young Generation : es un lugar donde vivió por un período corto y dividido en dos espacios:
Old Generation : este grupo básicamente contiene espacio virtual y reservado (reservado) y contendrá los objetos que sobrevivieron después de la recolección de basura de Young Generation.
Generación permanente: este grupo de memoria, como su nombre también dice, contiene metadatos de clase permanente e información de descriptores, por lo que el espacio PermGen siempre está reservado para las clases y aquellos que están vinculados a las clases, por ejemplo, miembros estáticos.
Caché de código (virtual o reservado): si está utilizando HotSpot Java VM, esto incluye el área de caché de código que contiene memoria que se utilizará para la compilación y el almacenamiento de código nativo.
Cortesía
fuente
La generación joven es donde todos los objetos nuevos se asignan y envejecen. Cuando la generación joven se llena, esto provoca una recolección menor de basura. Una generación joven llena de objetos muertos se recoge muy rápidamente. Algunos objetos sobrevivientes son viejos y eventualmente se trasladan a la vieja generación.
La Old Generation se usa para almacenar objetos de larga vida. Normalmente, se establece un umbral para el objeto de generación joven y cuando se cumple esa edad, el objeto se mueve a la generación anterior. Finalmente, la vieja generación necesita ser recogida. Este evento se llama recolección de basura principal
La generación permanente contiene metadatos requeridos por la JVM para describir las clases y los métodos utilizados en la aplicación. La generación permanente es poblada por la JVM en tiempo de ejecución en función de las clases en uso por la aplicación.
PermGen ha sido reemplazado por Metaspace desde el lanzamiento de Java 8.
Los parámetros PermSize y MaxPermSize serán ignorados ahora
Fuente de imagen y artículo de tutorial de oracle technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
" El proceso general de recolección de basura " en el artículo anterior explica las interacciones entre ellos con muchos diagramas.
Echa un vistazo al diagrama de resumen:
fuente
La máquina virtual Java está organizada en tres generaciones: una generación joven, una generación anterior y una generación permanente. La mayoría de los objetos se asignan inicialmente en la generación joven. La generación anterior contiene objetos que han sobrevivido a un cierto número de colecciones de generaciones jóvenes, así como algunos objetos grandes que pueden asignarse directamente en la generación anterior. La generación permanente contiene objetos que la JVM considera conveniente para que administre el recolector de basura, como objetos que describen clases y métodos, así como las clases y métodos en sí.
fuente
La memoria en SunHotSpot JVM está organizada en tres generaciones: generación joven, generación anterior y generación permanente.
FYI: El gen permanente no se considera parte del montón de Java.
¿Cómo interactúan / se relacionan las tres generaciones entre sí? Los objetos (excepto los grandes) se asignan primero a la generación joven. Si un objeto permanece vivo después de x no. de los ciclos de recolección de basura se promociona a la generación antigua / permanente. Por lo tanto, podemos decir que el gen joven contiene los objetos de corta duración, mientras que el gen antiguo contiene los objetos que tienen una larga vida. El gen permanente no interactúa con las otras dos generaciones.
fuente