java - maxmetaspacesize - Eliminación de PermGen en JDK 8
java-8 jvm (6)
Debido a que el espacio PermGen fue eliminado. La gestión de la memoria ha cambiado un poco.
He instalado JDK 8 y tratando de ejecutar Eclipse. Me aparece 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 de ignorar este argumento?
El espacio PermGen es reemplazado por MetaSpace en Java 8. Los argumentos PermSize y MaxPermSize JVM se ignoran y se emite una advertencia si está presente en el inicio.
La mayoría de las asignaciones para los metadatos de la clase ahora se asignan fuera de la memoria nativa. * Se han eliminado las clases que se utilizaron para describir los metadatos de la clase.
La principal diferencia entre el viejo PermGen y el nuevo MetaSpace es que no tiene que definir obligatoriamente el límite superior del uso de la memoria. Puede mantener el límite de espacio de MetaSpace sin límites. Por lo tanto, cuando el uso de la memoria aumenta, no obtendrá el error OutOfMemoryError. En su lugar, la memoria nativa reservada se incrementa para completar el aumento del uso de la memoria.
Puede definir el límite máximo de espacio para MetaSpace y, a continuación, lanzará OutOfMemoryError: espacio de metadatos. Por lo tanto, es importante definir este límite con cuidado, para que podamos evitar el desperdicio de memoria.
El espacio de la Generación Permanente (PermGen) se eliminó completamente y es reemplazado por un nuevo espacio llamado Metaspace. Las consecuencias de la eliminación de PermGen es que, obviamente, los argumentos PermSize y MaxPermSize JVM se ignoran y nunca obtendrá un java.lang.OutOfMemoryError
: Error de PermGen. El JDK 8 HotSpot JVM ahora usa memoria nativa para la representación de metadatos de clase y se llama Metaspace. Leer más >>
Esta es una de las nuevas características de Java 8, parte de las Propuestas de Mejora JDK 122 :
Elimine la generación permanente de la JVM de Hotspot 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 .
La implementación JVM de Oracle para Java 8 eliminó el modelo PermGen y lo reemplazó con http://java.dzone.com/articles/java-8-permgen-metaspace .
Las razones para ignorar estos argumentos son que la generación permanente se ha eliminado en HotSpot para JDK8 debido a los siguientes inconvenientes
- Tamaño fijo en el inicio - difícil de ajustar.
- Los tipos de hotspots internos eran objetos de Java: se podían mover con GC completo, opacos, no estaban muy escritos y eran difíciles de depurar, necesitaban metadatos.
- Simplifique las colecciones completas: iteradores especiales para metadatos para cada recopilador
- Desea desasignar los datos de clase simultáneamente y no durante la pausa de GC
- Habilitar futuras mejoras que fueron limitadas por PermGen.
El espacio de la generación permanente (PermGen) se ha eliminado por completo y es reemplazado por un nuevo espacio llamado Metaspace. Las consecuencias de la eliminación de PermGen es que, obviamente, los argumentos PermSize y MaxPermSize JVM se ignoran y nunca obtendrá un error java.lang.OutOfMemoryError: PermGen.
Ventajas del MetaSpace
- Aproveche la propiedad de especificación del lenguaje Java: las clases y los tiempos de vida de los metadatos asociados coinciden con el cargador de clases
- Área de almacenamiento por cargador - Metaspace
- Asignación lineal solamente
- Sin recuperación individual (excepto RedefineClasses y error de carga de clase)
- Sin escaneo GC o compactación
- No hay reubicación para objetos de espacio.
Afinación Metaspacial
El tamaño máximo del metaespacio se puede establecer con el indicador -XX: MaxMetaspaceSize, y el valor predeterminado es ilimitado, lo que significa que solo el límite de la memoria del sistema es. El indicador de ajuste -XX: MetaspaceSize define el tamaño inicial del metaspace. Si no especifica este indicador, el Metaspace cambiará de tamaño dinámicamente según la demanda de la aplicación en el 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 clase G1.
- Reducciones de tamaño de metadatos y proyectos de huella de JVM internos.
Hay un rendimiento mejorado de GC también. Mas detalle