¿Cuál es la diferencia entre PermGen y Metaspace?

118

Hasta Java 7, había un área en la memoria de JVM llamada PermGen , donde JVM solía mantener sus clases. En Java 8 fue eliminado y reemplazado por un área llamada Metaspace .

¿Cuáles son las diferencias más importantes entre PermGen y Metaspace?

La única diferencia que sé es que java.lang.OutOfMemoryError: PermGen spaceya no se puede lanzar y el parámetro de VM MaxPermSizese ignora.

Kao
fuente
primer resultado de Google: infoq.com/articles/Java-PERMGEN-Removed
the8472
@ the8472 Sí, pero este (y muchos otros) resultados de Google describen solo el mecanismo de Metaspace, sin mencionar nada sobre las diferencias exactas entre esto y PermGen.
Kao

Respuestas:

137

La principal diferencia desde la perspectiva del usuario, que creo que la respuesta anterior no enfatiza lo suficiente, es que Metaspace por defecto aumenta automáticamente su tamaño (hasta lo que proporciona el sistema operativo subyacente), mientras que PermGen siempre tiene un tamaño máximo fijo. Puede establecer un máximo fijo para Metaspace con parámetros de JVM, pero no puede hacer que PermGen aumente automáticamente.

En gran medida, es solo un cambio de nombre. Cuando se introdujo PermGen, no había Java EE o la (des) carga de clases dinámicas, por lo que una vez que se cargaba una clase, se quedaba atascada en la memoria hasta que se apagaba la JVM, por lo tanto, la generación permanente . Hoy en día, las clases se pueden cargar y descargar durante la vida útil de la JVM, por lo que Metaspace tiene más sentido para el área donde se guardan los metadatos.

Ambos contienen las java.lang.Classinstancias y ambos sufren fugas de ClassLoader . La única diferencia es que con la configuración predeterminada de Metaspace, toma más tiempo hasta que note los síntomas (ya que aumenta automáticamente tanto como puede), es decir, simplemente aleja el problema sin resolverlo. OTOH Me imagino que el efecto de quedarse sin memoria del sistema operativo puede ser más severo que simplemente quedarse sin JVM PermGen, así que no estoy seguro de que sea una gran mejora.

Ya sea que esté usando una JVM con PermGen o con Metaspace, si está realizando una descarga de clases dinámica, debe tomar medidas contra las fugas del cargador de clases, por ejemplo, utilizando mi biblioteca ClassLoader Leak Prevention .

Mattias Jiderhamn
fuente
17
Ni Permgen ni Metaspace contienen instancias de la clase Class. Solo mantienen metainformación sobre clases cargadas. Las instancias de la clase Class se mantienen en un montón regular, como las instancias de otras clases.
Joe promedio
Buena comparación. Gracias
Sandeep
1
Por cierto, OTOH significa "Por otro lado"
sofs1
43

Adiós, PermGen, hola Metaspace

PermGen se ha eliminado por completo.

Recolección de basura de Metaspace basura de las clases muertas y los cargadores de clases se activa una vez que el uso de metadatos de clase alcanza el MaxMetaspaceSize.

El espacio que Metadatase mantuvo ya no es contiguo al Java heap, El metadataahora se ha trasladado a la memoria nativa a un área conocida como elMetaspace .

En palabras simples ,

Dado que los metadatos de la clase se asignan fuera de la memoria nativa, el espacio máximo disponible es la memoria total disponible del sistema. Por lo tanto, ya no encontrarásOOM errors y podría terminar derramándose en el espacio de intercambio.

La eliminación de PermGen no significa que los problemas de fugas del cargador de clases hayan desaparecido. Entonces, sí, aún tendrá que monitorear su consumo y planificar en consecuencia, ya que una fuga terminaría consumiendo toda su memoria nativa.

Algunos otros artículos, con análisis: Link1 , Link2 y este

Ankur Singhal
fuente
6
En lugar de MaxPermGen, tiene MaxMetaspaceSize, por lo que no hay razón para que use más o menos memoria o tenga menos control.
Peter Lawrey
2
¿De qué recuerdo estamos hablando aquí? Memoria RAM o memoria HDD.
Dinesh
1
@Dinesh RAM (memoria interna)
Aditya Gupta
10

En resumen, el tamaño de Metaspace aumenta automáticamente en la memoria nativa según sea necesario para cargar metadatos de clase si no se restringe con -XX:MaxMetaspaceSize

Chandrasekaran
fuente