2010-01-24 23 views
255

estoy tratando de entender cómo los conceptos de jóvenes, edad y generaciones permanentes en la terminología del montón de Java, y más específicamente las interacciones entre las tres generaciones.Terminología del montón de Java: ¿generaciones jóvenes, viejas y permanentes?

Mis preguntas son:

  • ¿Cuál es la generación joven?
  • ¿Qué es la generación anterior?
  • ¿Cuál es la generación permanente?
  • ¿Cómo interactúan las tres generaciones/se relacionan entre sí?
+1

también relacionado con esta cuestión "generación titular" – gstackoverflow

Respuesta

256

Esto parece un malentendido común. En 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 internas también se almacenaban en la generación permanente. En Java 7, las cadenas internas se almacenan en el montón de objetos principal.

Aquí hay un good post on permanent generation.

me gustan las descripciones dadas para cada espacio en guide on JConsole de Oracle:

Para el Java HotSpot VM, la memoria piscinas para la recolección de basura en serie son los siguientes.

  • Eden Space (heap): El conjunto desde el que inicialmente se asigna la memoria para la mayoría de los objetos.
  • Survivor Space (Heap): el grupo que contiene objetos que han sobrevivido la recolección de basura del espacio Eden .
  • Generación sostenida (heap): grupo que contiene objetos que han existido durante algún tiempo en el espacio del superviviente.
  • Generación permanente (no acumulativa): el conjunto que contiene todos los datos reflectantes de la máquina virtual en sí, como 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 de lectura y escritura.
  • caché de código (no apilable): la máquina virtual Java de HotSpot también incluye un caché de código, que contiene la memoria que se utiliza para la compilación y el almacenamiento del 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 sobrevivan (si todavía hay referencias a él), más se promueve. Comienza en la generación joven (que a su vez está dividida en espacios múltiples, Edén y Superviviente) y eventualmente terminaría en la generación permanente si sobreviviera lo suficiente.

+1

Creo que a partir de Java 7, las cadenas ya no se internan en la generación permanente. –

+0

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 el metaespacio (aunque no estoy seguro de cuán diferente será, además de no ser ilimitado por defecto) –

+8

Joshua - es "viejo" sinónimo de "titular", y es "nuevo" "sinónimo de" sobreviviente? " – joadha

4

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 para aún más información en la parte inferior.

14

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 varias colecciones de generaciones jóvenes, así como algunos objetos grandes que pueden asignarse directamente en la generación anterior. La generación permanente contiene los objetos que la JVM considera convenientes para la gestión del recolector de elementos no utilizados, como los objetos que describen clases y métodos, así como las clases y los métodos mismos.

3

Aunque se trata de sintonizar No puedo resistir recomendar este document eche un vistazo al capítulo 3 y profundice si lo desea.

+1

Ese documento fue para J2SE 5, es aquí mismo documento pero para J2SE 6 - http: // www .oracle.com/technetwork/java/javase/gc-tuning-6-140523.html – hagrawal

11

This article es una encuesta muy buena 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 resultará mucho más fácil leer y comprender los diversos documentos que otros han señalado.

(Lo que el documento carece de alguna información acerca de la investigación post-1993 sobre los recolectores de basura, especialmente todo el asunto de los sistemas multi-núcleo. Sin embargo, usted tiene que aprender a caminar antes de aprender a ejecutar.)

138

El montón se divide en las generaciones jóvenes y viejos de la siguiente manera:

la generación joven: es el lugar donde vivió por un período breve y se divide en dos espacios:

  • Eden Space: Cuando el objeto creado con la nueva memoria de palabras clave asignó en este espacio.
  • Survivor Space: Esta es la agrupación que contiene objetos que han sobrevivido después de la recolección de basura de java desde el espacio de Eden.

vieja generación: Esta piscina es básicamente contiene tenured y virtual espacio (reservado) y será la celebración de aquellos objetos que sobrevivieron después de la recolección de basura de la generación joven.

  • Titular Espacio: Este bloque de memoria contiene los 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 desde el espacio sobreviviente.

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

actualización Java8:PermGen se reemplaza con metaespacio que es muy similar.
La principal diferencia es que Metaspace cambia de tamaño de forma dinámica, es decir, puede expandirse en tiempo de ejecución.
espacio de Java metaespacio: sin límites (por defecto)

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

enter image description here

Courtesy

+2

Excelente respuesta, debe marcarse como la correcta – alexanoid

+0

@Premraj ¿Qué significa ** Metaspace cambia el tamaño de forma dinámica, es decir, se puede expandir en tiempo de ejecución. **? ¿La única diferencia es que, por defecto, no tiene un borde superior? – gstackoverflow

+0

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

0

Memoria en SunHotSpot JVM está organizado en tres generaciones: la generación joven, de antigua generación y generación permanente.

  • Young Generation: 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 promueven a la vieja generación, es decir, los objetos de larga vida se alojan en la vieja generación.
  • Generación permanente: la generación permanente contiene los objetos que la JVM considera convenientes para la gestión del recolector de elementos no utilizados, como los objetos que describen clases y métodos, así como las clases y los métodos mismos.

FYI: El gen permanente no se considera una parte del montón de Java.

¿Cómo interactúan/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 al gen viejo/tenured. Por lo tanto, podemos decir que el gen joven contiene los objetos efímeros mientras que el gen antiguo contiene los objetos que tienen una vida larga. El gen permanente no interactúa con las otras dos generaciones.

26

¿Qué es la generación joven?

El la generación joven es donde se asignan y edad todos los objetos nuevos. 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.

¿Qué es la generación anterior?

la vieja generaciónse utiliza para almacenar objetos larga supervivientes. 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 colección importante de basura

¿Cuál es la generación permanente?

El generación Permanente contiene metadatos requerida 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 Java 8.

serán ignorados PermSize & MaxPermSize parámetros ahora

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

enter image description here

Fuente de la imagen & oráculo artículo TechNetwork tutorial: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

"la basura general Proceso de Cobro" en el artículo anterior explica las interacciones entre ellos con muchos diagramas.

Tenga una mirada en el diagrama Resumen:

enter image description here

+0

excelente ... ¿puedo saber dónde reside el área de método, el conjunto de la fuente nativa y el conjunto de la constante de tiempo de ejecución en esta imagen? y lo que tienen en consecuencia? –

+0

consulte https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html para obtener más detalles. El área de método se crea en el inicio de la máquina virtual. Aunque el área del método es lógicamente parte del montón, las implementaciones simples pueden optar por no recoger basura o compactarla. Cada grupo constante de tiempo de ejecución se asigna desde el área de método de la máquina virtual Java –

+0

¿está seguro de ... he estado leyendo que es parte del espacio permgen (que no es un montón)? http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java –

Cuestiones relacionadas