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 space
ya no se puede lanzar y el parámetro de VM MaxPermSize
se ignora.
Respuestas:
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.Class
instancias 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 .
fuente
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
Metadata
se mantuvo ya no es contiguo alJava heap
, Elmetadata
ahora 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ás
OOM 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
fuente
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
fuente