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


Hasta Java 7 había un área en la memoria 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 conozco es que java.lang.OutOfMemoryError: PermGen space ya no se puede lanzar y el parámetro VM MaxPermSize se ignora.

Author: Kao, 2014-11-25

3 answers

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 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 dynamic class (un)loading, por lo que una vez que se cargó una clase se quedó atascada en la memoria hasta que la JVM se apagó - por lo tanto Permanente Generación. Hoy en día las clases pueden cargarse y descargarse 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 java.lang.Class y ambos sufren de fugas de ClassLoader. La única diferencia es que con la configuración predeterminada de Metaspace, tarda más tiempo hasta que note los síntomas (ya que auto aumenta tanto como puede), es decir, usted acaba de empujar el problema más lejos sin resolverlo. OTOH Me imagino que el efecto de quedarse sin memoria del sistema operativo puede ser más grave que simplemente quedarse sin JVM PermGen, por lo 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 dinámica de clases, debe tomar medidas contra las fugas de classloader, por ejemplo, utilizando mi Prevención de fugas de ClassLoader library .

 97
Author: Mattias Jiderhamn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-26 08:12:12

Bye, Bye PermGen, Hello Metaspace

PermGen ha sido completamente eliminado.

Metaspace garbage collection - La recolección de basura de las clases muertas y classloaders se activa una vez que el uso de metadatos de la clase alcanza el MaxMetaspaceSize.

El espacio Metadata ya no es contiguo al Java heap, el metadata ahora se ha movido a la memoria nativa a un área conocida como el Metaspace.

En palabras Simples,

Desde la clase los metadatos 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á 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. Por lo tanto, sí, todavía 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

 27
Author: Ankur Singhal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:30

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

 7
Author: Chandrasekaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-13 10:58:28