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


Estoy tratando de entender cómo los conceptos de joven, antiguas y generaciones permanentes en la terminología Java heap, 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í?
Author: Ravindra babu, 2010-01-25

8 answers

Esto parece un malentendido común. En la JVM de Oracle, la generación permanente no forma parte del montón. Es un espacio separado para las definiciones de clase y los datos relacionados. En Java 6 y anteriores, las cadenas interned 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 un buen post sobre la 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 de HotSpot, la memoria pools para recolección de basura en serie son los siguientes.

  • Eden Space (heap) : El grupo desde el que se asigna inicialmente la memoria para la mayoría de los objetos.
  • Espacio sobreviviente (heap): El pool que contiene objetos que han sobrevivido la recolección de basura del Edén espacio.
  • Tenured Generation (heap) : El pool que contiene objetos que han existido por algún tiempo en el survivor espacio.
  • Generación permanente (no montón) : La piscina que contiene todos los reflectantes datos de la propia máquina virtual, tales como objetos de clase y método. Con Máquinas virtuales Java que utilizan el uso compartido de datos de clase, esta generación se divide en áreas de solo lectura y lectura-escritura.
  • Caché de código (no heap) : La máquina virtual Java de HotSpot también incluye una caché de código, contiene la memoria que se utiliza para compilación y almacenamiento de datos nativos codificar.

Java utiliza generacional recolección de basura. 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 promociona. Comienza en la generación joven (que a su vez se divide en múltiples espacios - Eden y Survivor) y eventualmente terminaría en la generación titular si sobreviviera el tiempo suficiente.

 265
Author: Joshua McKinnon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-23 19:54:06

El Montón se divide en generaciones jóvenes y viejas de la siguiente manera :

Generación joven : Es el lugar donde vivió por corto período y dividido en dos espacios:

  • Eden Space : Cuando se crea un objeto usando una nueva palabra clave memory allocated en este espacio.
  • Survivor Space : Este es el pool que contiene objetos que tienen sobrevivió después de la recolección de basura de Java del espacio Edén.

Antigua generación : Esta piscina es básicamente contener titular y virtual (reservado) espacio y estará sosteniendo los objetos que sobrevivieron después de la recolección de basura de la Generación Joven.

  • Espacio de tenencia: Este grupo de memoria contiene objetos que sobrevivieron después de la recolección múltiple de basura significa objeto que sobrevivió después de la recolección de basura del espacio de Sobreviviente.

Generación permanente: Este grupo de memoria como nombre también dice contiene metadatos de clase permanente y descriptores información por lo que PermGen espacio siempre reservado para las clases y aquellos que está ligado a las clases por ejemplo los miembros estáticos.

Actualización Java8: PermGen se sustituye por Metaspace que es muy similar.
La principal diferencia es que Metaspace cambia de tamaño dinámicamente, es decir, puede expandirse en tiempo de ejecución.
Java Metaspace space: unbounded (por defecto)

Caché de código (Virtual o reservado): Si está utilizando HotSpot Java VM esto incluye el área de caché de código que contiene la memoria que se utilizará para la compilación y el almacenamiento de código nativo.

introduzca la descripción de la imagen aquí

Cortesía

 153
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-02 23:42:26

¿Qué es la generación joven?

La Generación Joven es donde todos los nuevos objetos son asignados y envejecidos. Cuando la generación joven se llena, esto causa una recolección de basura menor. Una generación joven llena de objetos muertos se recoge muy rápidamente. Algunos objetos sobrevivientes son envejecidos y eventualmente se trasladan a la vieja generación.

¿Qué es la vieja generación?

La Antigua Generación se usa para almacenar objetos que sobreviven durante mucho tiempo. Por lo general, 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. Con el tiempo, la vieja generación necesita ser recogida. Este evento se llama recolección de basura mayor

¿Qué es la generación permanente?

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

PermGen ha sido reemplazado por Metaspace desde el lanzamiento de Java 8.

PermSize & MaxPermSize los parámetros se ignorarán ahora

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

introduzca la descripción de la imagen aquí

Fuente de imagen y oracle technetwork tutorial artículo: 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.

Eche un vistazo al diagrama de resumen:

introduzca la descripción de la imagen aquí

 32
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-01 13:34:08

La máquina virtual de Java está organizada en tres generaciones: una generación joven, una generación vieja y una generación permanente. La mayoría de los objetos se asignan inicialmente en la generación joven. La generación antigua contiene objetos que han sobrevivido a algunas colecciones de la generación joven, así como algunos objetos grandes que pueden asignarse directamente en la generación antigua. La generación permanente contiene objetos que la JVM considera convenientes para que el recolector de basura administre, como objetos que describen clases y métodos, así como las propias clases y métodos.

 14
Author: Mark R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-24 21:57:38

Este artículo es una muy buena encuesta sobre los recolectores de basura. Define los conceptos básicos y la terminología de la recolección de basura e incluye muchos dibujos explicativos. Es una "lectura obligada" para cualquiera que esté interesado en cómo funciona la asignación automática de memoria; leerla hará que sea mucho más fácil para usted leer y comprender los diversos documentos que otros han señalado.

(Lo que le falta a ese documento es cualquier información sobre la investigación post-1993 sobre los recolectores de basura, especialmente todo el negocio de los sistemas multinúcleo. Aún así, tienes que aprender a caminar antes de aprender a correr.)

 11
Author: Thomas Pornin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-26 16:16:50

Asumiendo que estás hablando de Sun JDK/OpenJDK, consulta 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.

 4
Author: Nicholas Riley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-24 21:52:59

Aunque se trata de afinar, no puedo resistirme a recomendar este documento eche un vistazo al capítulo 3 y profundice si lo desea.

 3
Author: stacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-24 22:20:15

La memoria en SunHotSpot JVM se organiza en tres generaciones: generación joven, generación vieja y generación permanente.

  • Generación joven: los objetos recién creados se asignan a la generación joven.
  • Generación antigua : Si el nuevo objeto solicita un espacio de montón más grande, se asigna directamente a la generación antigua. También los objetos que han sobrevivido a unos pocos ciclos de GC se promueven a la generación antigua, es decir, los objetos de larga vida se alojan en la generación antigua.
  • Generación permanente : La generación permanente contiene objetos que la JVM considera conveniente que el recolector de basura administre, como objetos que describen clases y métodos, así como las clases y métodos en sí.

Para su información: El gen permanente no se considera parte del montón de Java.

¿Cómo interactúan/se relacionan las tres generaciones? Los objetos(excepto los grandes) se asignan primero a la generación joven. Si un objeto permanece vivo después de x no. de por lo tanto, podemos decir que la generación joven contiene los objetos de corta duración, mientras que la generación vieja contiene los objetos que tienen una larga vida. La generación permanente no interactúa con las otras dos generaciones.

 0
Author: KrityAg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-29 14:58:38