java java-8 java-7 permgen metaspace

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



java-8 java-7 (3)

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

Hasta Java 7, había un área en la memoria JVM llamada PermGen , donde JVM solía guardar sus clases. En Java 8 , se eliminó y reemplazó por el área denominada Metaspace .

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

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


La principal diferencia desde la perspectiva del usuario, que creo que la respuesta anterior no es lo suficientemente fuerte , es que el Metaspace de forma automática 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 JVM, pero no puede hacer que PermGen aumente automáticamente.

En gran medida, es solo un cambio de nombre. Antes, cuando se introdujo PermGen, no había carga de Java EE o de clase dinámica (un), 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, 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 instancias de java.lang.Class y ambos sufren filtraciones de ClassLoader . La única diferencia es que con la configuración predeterminada de Metaspace, toma más tiempo hasta que nota los síntomas (ya que aumenta automáticamente tanto como puede), es decir, simplemente aleja el problema sin resolverlo. OTOH Imagino que el efecto de quedarse sin memoria OS puede ser más grave que simplemente quedarse sin JVM PermGen, así que no estoy seguro de que sea una gran mejora.

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


Bye, Bye PermGen, Hola Metaspace

PermGen ha sido eliminado por completo.

Recopilación de basura Metaspace: la recolección de basura de las clases inactivas y los cargadores de clases se desencadena una vez que el uso de los metadatos de la clase alcanza MaxMetaspaceSize .

El espacio de Metadata se mantuvo ya no es contiguo al Java heap . Los metadata ahora se han movido a la memoria nativa a un área conocida como Metaspace .

En palabras simples ,

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

La eliminación de PermGen no significa que los problemas de pérdida de carga de su clase hayan desaparecido. Entonces, sí, igual tendrá que controlar su consumo y planificar en consecuencia, ya que una fuga terminaría consumiendo toda su memoria nativa.

Algunos otros artículos, con análisis: infoq.com/articles/Java-PERMGEN-Removed , Link2 , y this