Eliminación de PermGen en JDK 8

229

He instalado JDK 8 e intento ejecutar Eclipse. Recibo el siguiente mensaje de advertencia:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

¿Cuáles son las razones para ignorar esta opción de VM?

Shamim Ahmmed
fuente
44
Puede encontrar este informativo: javaeesupportpatterns.blogspot.co.uk/2013/02/…
Andrew Martin

Respuestas:

358

Las razones para ignorar este argumento es que la generación permanente se ha eliminado en HotSpot para JDK8 debido a los siguientes inconvenientes

  • Tamaño fijo al inicio: difícil de sintonizar.
  • Los tipos de Hotspot internos eran objetos Java: podían moverse con GC completo, opacos, no fuertemente tipados y difíciles de depurar, necesitaban meta-metadatos.
  • Simplifique las colecciones completas: iteradores especiales para metadatos para cada recopilador
  • Desea desasignar datos de clase simultáneamente y no durante la pausa del GC
  • Habilite futuras mejoras que fueron limitadas por PermGen.

El espacio de generación permanente (PermGen) se ha eliminado por completo y se reemplaza por un nuevo espacio llamado Metaspace. Las consecuencias de la eliminación de PermGen es que, obviamente, se ignoran los argumentos JVM de PermSize y MaxPermSize y nunca obtendrá un error java.lang.OutOfMemoryError: PermGen.

Ventajas de MetaSpace

  • Aproveche la propiedad de especificación de lenguaje Java: las clases y las vidas de metadatos asociados coinciden con las del cargador
  • Por área de almacenamiento del cargador - Metaspace
  • Solo asignación lineal
  • Sin reclamación individual (excepto RedefineClasses y fallo de carga de clase)
  • Sin escaneo GC o compactación
  • Sin reubicación para objetos de metaespacio

Metaspace Tuning

El tamaño máximo de metaespacio se puede establecer con el indicador -XX: MaxMetaspaceSize, y el valor predeterminado es ilimitado, lo que significa que solo la memoria de su sistema es el límite. El indicador de ajuste -XX: MetaspaceSize define el tamaño inicial de metaspace. Si no especifica este indicador, el Metaspace cambiará de tamaño dinámicamente dependiendo de la demanda de la aplicación en tiempo de ejecución.

El cambio permite otras optimizaciones y características en el futuro

  • Uso compartido de datos de clase de aplicación
  • Optimizaciones de colecciones jóvenes, descarga de clase G1
  • Reducciones de tamaño de metadatos y proyectos de huella JVM internos

También se ha mejorado el rendimiento de GC. Mas detalle

pardeep131085
fuente
29
Debo mencionar que las cadenas internadas se almacenaron previamente en el espacio PermGen, pero se movieron al montón principal de Java en Java 7.
gparyani
Gracias por la explicación detallada.
Pradeep
3
Un poco de introducción suave para la audiencia en general (me refiero principalmente a personas que no son de Java, por ejemplo, compañeros devops que tienen que lidiar con JVM) no haría daño en esta respuesta.
ulidtko
117

Esta es una de las nuevas características de Java 8, parte de las Propuestas 122 de mejora de JDK :

Elimine la generación permanente del Hotspot JVM y, por lo tanto, la necesidad de ajustar el tamaño de la generación permanente.

La lista de todos los JEP que se incluirán en Java 8 se puede encontrar en la página de hitos de JDK8 .

asilias
fuente
19

El espacio de Generación Permanente (PermGen) se ha eliminado por completo y se reemplaza por un nuevo espacio llamado Metaspace. Las consecuencias de la eliminación de PermGen son que, obviamente, los argumentos JVM de PermSize y MaxPermSize se ignoran y nunca obtendrá un java.lang.OutOfMemoryErrorerror: PermGen. El JDK 8 HotSpot JVM ahora está usando memoria nativa para la representación de metadatos de clase y se llama Metaspace. Leer más >>

Dhrumil Shah
fuente
3
'HotSpot JVM ahora está utilizando memoria nativa para la representación de metadatos de clase. - ¿Y qué memoria utilizó HotSpot JVM anteriormente? ¿Y cuál es la exactitud de la 'memoria nativa'?
Andrey M. Stepanov
12

El espacio PermGen se reemplaza por MetaSpace en Java 8. Los argumentos JVM PermSize y MaxPermSize se ignoran y se emite una advertencia si está presente al inicio.

La mayoría de las asignaciones para los metadatos de la clase ahora se asignan fuera de la memoria nativa. * Las clases que se usaron para describir los metadatos de la clase se han eliminado.

La principal diferencia entre el antiguo PermGen y el nuevo MetaSpace es que no tiene que definir obligatoriamente el límite superior de uso de memoria. Puede mantener el límite de espacio MetaSpace ilimitado. Por lo tanto, cuando el uso de memoria aumenta, no obtendrá el error OutOfMemoryError. En cambio, la memoria nativa reservada se incrementa para llenar por completo el aumento del uso de memoria.

Puede definir el límite máximo de espacio para MetaSpace, y luego arrojará OutOfMemoryError: espacio de metadatos. Por lo tanto, es importante definir este límite con cautela, para que podamos evitar el desperdicio de memoria.

Shubham Pandey
fuente
9

La implementación JVM de Oracle para Java 8 eliminó el modelo PermGen y lo reemplazó con Metaspace .

chrylis -cautelosamente optimista-
fuente