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 .