example - new icon java
¿La terminología del montón de Java: generaciones jóvenes, viejas y permanentes? (8)
¿Qué es la generación joven?
La generación joven 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 supervivientes envejecen y finalmente se trasladan a la vieja generación.
¿Qué es la vieja generación?
La vieja generación se utiliza para almacenar objetos que han sobrevivido durante mucho tiempo. 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. Eventualmente la vieja generación necesita ser recogida. Este evento se llama una importante recolección de basura.
¿Qué es la generación permanente?
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 se completa con la JVM en tiempo de ejecución en función de las clases en uso por la aplicación.
PermGen ha sido reemplazado con 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í?
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 resumen:
Estoy tratando de entender cómo los conceptos de 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í?
El montón se divide en generaciones jóvenes y viejas de la siguiente manera:
Generación joven : es el lugar donde vivió por un período corto y se dividió en dos espacios:
- Eden Space : cuando se crea un objeto utilizando una nueva memoria de palabras clave asignada en este espacio.
- Espacio de sobreviviente : Este es el grupo que contiene objetos que han sobrevivido después de la recolección de basura java desde el espacio de Eden.
Old Generation : esta agrupación básicamente contiene espacio de tenencia y virtual (reservado) y mantendrá los objetos que sobrevivieron después de la recolección de basura de Young Generation.
- Espacio establecido: este grupo de memoria contiene objetos que sobrevivieron después de una recolección de basura múltiple significa un objeto que sobrevivió después de la recolección de basura del espacio de Survivor.
Generación permanente: este grupo de memoria como nombre también dice que contiene metadatos de clase permanentes e información de descriptores, por lo que el espacio PermGen siempre se reserva 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 redimensiona 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 un área de cache de código que contiene memoria que se usará para la compilación y el almacenamiento del código nativo.
Aunque se trata de sintonizar, no puedo resistirme a recomendar este document Eche un vistazo al capítulo 3 y profundice si lo desea.
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 definiciones de clase y datos relacionados. En Java 6 y versiones anteriores, las cadenas internas también se almacenaron en la generación permanente. En Java 7, las cadenas internas 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 el HotSpot Java VM, los grupos de memoria para la recolección de basura en serie son los siguientes.
- Eden Space (heap): el grupo desde el cual la memoria se asigna inicialmente para la mayoría de los objetos.
- Espacio de sobreviviente (montón): el grupo que contiene objetos que han sobrevivido a la recolección de basura del espacio de Eden.
- Generación permanente (montón): la agrupación que contiene objetos que han existido durante algún tiempo en el espacio de sobrevivientes.
- Generación permanente (no de pila): la agrupación que contiene todos los datos reflexivos de la propia máquina virtual, como los objetos de clase y método. Con las máquinas virtuales de Java que utilizan el intercambio de datos de clase, esta generación se divide en áreas de solo lectura y de lectura y escritura.
- Caché de código (no de pila): HotSpot Java VM también incluye un caché de código, que contiene la 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 promoverá. 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 permanente si sobreviviera lo suficiente.
La máquina virtual de Java está organizada en tres generaciones: una generación joven, una generación antigua 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 algunas 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 administrar el recolector de basura, como los objetos que describen clases y métodos, así como las clases y los métodos en sí.
La memoria en SunHotSpot JVM se organiza en tres generaciones: generación joven, generación antigua y generación permanente.
- Generación joven: los objetos recién creados se asignan a la generación joven.
- Antigua generación: si el nuevo objeto solicita un espacio de almacenamiento más grande, se asigna directamente a la generación anterior. Además, los objetos que han sobrevivido a unos pocos ciclos de GC se promocionan a la vieja generación, es decir, los objetos de larga vida se alojan en la antigua generación.
- Generación permanente: la generación permanente contiene objetos que la JVM considera conveniente para administrar el recolector de basura, como los objetos que describen clases y métodos, así como las clases y los métodos en sí.
FYI: la generación 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 promueve a la antigua / tenencia gen. Por lo tanto, podemos decir que la generación joven contiene los objetos de vida corta, mientras que la generación antigua contiene los objetos que tienen una vida larga. El gen permanente no interactúa con las otras dos generaciones.
Suponiendo que esté hablando de Sun JDK / OpenJDK, consulte la página en el sitio web de OpenJDK en Storage Management . Hay un par de enlaces a más información en la parte inferior.
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; Al leerlo, le será mucho más fácil leer y comprender los diversos documentos que otros han señalado.
(Lo que falta en ese documento es cualquier información acerca de la investigación posterior a 1993 sobre los recolectores de basura, especialmente todo el negocio de los sistemas de múltiples núcleos. Sin embargo, debe aprender a caminar antes de aprender a correr).