Terminología del montón de Java: ¿generaciones jóvenes, viejas y permanentes?


318

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í?

Suponiendo que está hablando de Sun JDK / OpenJDK, consulte la página del sitio web de OpenJDK en Storage Management . Hay un par de enlaces a más información en la parte inferior.
Nicholas Riley

1
también relacionado con esta pregunta "generación permanente"
gstackoverflow

Respuestas:


304

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 :

Para la máquina virtual Java HotSpot, los grupos de memoria para la recolección de basura en serie son los siguientes.

  • Eden Space (montón): el grupo desde el cual se asigna inicialmente la memoria para la mayoría de los objetos.
  • Survivor Space (heap): el grupo que contiene objetos que han sobrevivido a la recolección de basura del espacio Eden.
  • Tenured Generation (heap): el grupo que contiene objetos que han existido durante algún tiempo en el espacio de sobreviviente.
  • Generación permanente (sin almacenamiento dinámico): el grupo que contiene todos los datos reflectantes de la máquina virtual en sí, como los objetos de clase y método. Con máquinas virtuales Java que utilizan el intercambio de datos de clase, esta generación se divide en áreas de solo lectura y lectura-escritura.
  • Caché de código (sin almacenamiento dinámico): la máquina virtual Java de HotSpot también incluye un caché de código, que contiene memoria que se utiliza para la compilación y el almacenamiento de código nativo.

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.


2
Creo que a partir de Java 7, las cadenas ya no están internados en la generación permanente.
Tim Goodman el

Tienes razón, me sorprende que haya sobrevivido tanto tiempo antes de una mención. Luego, en Java 8, la generación permanente será reemplazada por metaspace (aunque no estoy seguro de cuán diferente será realmente, aparte de ser ilimitado por defecto)
Joshua McKinnon

99
Joshua: ¿"viejo" es sinónimo de "titular" y "nuevo" es sinónimo de "sobreviviente"?
joadha

1
la generación permanente solo es aplicable antes de Java 8.
lwpro2

2
En caso de que todavía estés esperando una respuesta, sí, tienes razón @joadha. Echa un vistazo a este enlace: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

The Heap se divide en generaciones jóvenes y viejas de la siguiente manera:

Young Generation : es un lugar donde vivió por un período corto y dividido en dos espacios:

  • Espacio Eden : cuando se crea un objeto utilizando una nueva memoria de palabras clave asignada en este espacio.
  • Survivor Space : este es el grupo que contiene objetos que han sobrevivido después de la recolección de basura java del espacio Eden.

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.

  • Espacio ocupado: este grupo de memoria contiene objetos que sobrevivieron después de la recolección de basura múltiple, significa objeto que sobrevivió después de la recolección de basura del espacio Survivor.

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.

Actualización de Java8: PermGen se reemplaza con Metaspace, que es muy similar.
La principal diferencia es que Metaspace cambia el tamaño dinámicamente, es decir, puede expandirse en tiempo de ejecución.
Espacio Java Metaspace: sin límites (predeterminado)

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.

ingrese la descripción de la imagen aquí

Cortesía


@Premraj, ¿qué significa Metaspace redimensiona dinámicamente, es decir, puede expandirse en tiempo de ejecución. ? ¿La única diferencia es que por defecto no tiene borde superior?
gstackoverflow

1
excelente ... ¿puedo saber dónde reside el área de método, el stack nativo y el grupo constante de tiempo de ejecución en esta imagen? y lo que tienen en consecuencia?

si se usa el caché de código para el código de método nativo, ¿qué tendrá la pila de métodos nativos (cada subproceso tendrá uno)?

49

¿Qué es la generación joven?

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.

¿Qué es 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

¿Qué es la generación permanente?

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

¿Cómo interactúan / se relacionan las tres generaciones entre sí?

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí


excelente ... ¿puedo saber dónde reside el área de método, el stack nativo y el grupo constante de tiempo de ejecución en esta imagen? y lo que tienen en consecuencia?

consulte docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html para obtener más detalles. El área de método se crea al iniciar la máquina virtual. Aunque el área del método es lógicamente parte del montón, las implementaciones simples pueden elegir no recolectar basura ni compactarla. Cada grupo constante de tiempo de ejecución se asigna desde el área de método de la máquina virtual Java
Ravindra babu

¿estás seguro ... que he estado leyendo que es parte del espacio permgen (que no es el montón)? journaldev.com/2856/…

La documentación de Oracle es más auténtica
Ravindra babu

¿Está establecido el umbral para el objeto de generación joven en unidades de tiempo (por ejemplo, ms)? o rondas GC?
Muy objetivo

16

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í.


1

La memoria en SunHotSpot JVM está organizada en tres generaciones: generación joven, generación anterior y generación permanente.

  • Generación joven: los objetos recién creados se asignan a la generación joven.
  • Generación anterior: si el nuevo objeto solicita un espacio de almacenamiento dinámico más grande, se asigna directamente a la generación anterior. También los objetos que han sobrevivido a algunos ciclos de GC se promocionan a la generación anterior, es decir, los objetos de larga vida se alojan en la generación anterior.
  • Generación permanente: 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í.

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.