Red de conocimiento informático - Aprendizaje de programación - ¿Dónde están los enlaces permanentes de Java?

¿Dónde están los enlaces permanentes de Java?

Java 8: De PermGen a Metaspace

Como todos sabemos, una de las nuevas características de Java 8 es la eliminación completa del espacio de generación permanente que Oracle ha estado reclamando desde el lanzamiento de JDK7. Por ejemplo, la agrupación interna de cadenas se eliminó de los enlaces permanentes en JDK7, y el lanzamiento de JDK8 marcará el final de esta práctica. Sucesor de PermGen:

Metaspace:

El nacimiento de un nuevo espacio de memoria

JDK8 HotSpot JVM utiliza memoria local para almacenar información de metadatos de clase y lo llama: Metaspace .Metaspace); esto es muy similar a Oracle JRockit e IBM JVM. Estas son buenas noticias: significa que no habrá más problemas con java.lang.OutOfMemoryError: PermGen, ni más ajustes y monitoreo del uso del espacio de memoria…. Pero espera, es demasiado pronto para saberlo.

Estos cambios son transparentes de forma predeterminada y nuestra próxima demostración le permitirá saber que el uso de memoria de los metadatos de clase sigue siendo una preocupación.

Es importante recordar que esta nueva característica no eliminará mágicamente las pérdidas de memoria causadas por clases y cargadores de clases.

Deberá utilizar un enfoque diferente y cumplir con nuevas convenciones de nomenclatura para realizar un seguimiento de estos problemas.

El resumen es el siguiente:

El estado del espacio PermGen

Esta parte del espacio de memoria se eliminará por completo.

Parámetros para JVM: PermSize y MaxPermSize se ignorarán y se emitirá una advertencia si ambos parámetros están configurados cuando están habilitados.

Modo de asignación de memoria del metaespacio

La mayoría de los metadatos de clase se asignan en la memoria local.

Se ha eliminado la "clase" utilizada para describir los metadatos de la clase.

Capacidad del metaespacio

De forma predeterminada, los metadatos de clase están limitados solo por la cantidad de memoria local disponible (esto depende de la cantidad de memoria virtual disponible en sistemas operativos de 32 o 64 bits). sistemas).

El nuevo parámetro (MaxMetaspaceSize) se utiliza para limitar el tamaño de la memoria local asignada para los metadatos de la clase. Si no se especifica este parámetro, el metaespacio se ajustará dinámicamente según sea necesario en tiempo de ejecución.

Recolección de basura del metaespacio

Cuando el uso de metadatos alcanza el valor establecido por el parámetro "MaxMetaspaceSize", las clases inactivas y los cargadores de clases se recolectarán como basura.

Para minimizar la frecuencia de recolección de basura y reducir la latencia, es necesario monitorear y ajustar el metaespacio cuando sea apropiado. La recolección de basura persistente del metaespacio indica que puede haber una pérdida de memoria causada por la clase, el cargador de clases o una configuración de tamaño incorrecta.

Impacto en la memoria del montón de Java

Algunos datos diversos se han movido al espacio del montón de Java. Después de actualizar a JDK8, notará un aumento en el espacio del montón de Java.

Monitoreo de metaespacio

El uso de metaespacio está disponible en la salida detallada del registro de GC de HotSpot 1.8.

Cuando probamos con la versión b75, las dos herramientas Jstat y JVisualVM se actualizaron, pero todavía vemos aparecer el antiguo espacio PermGen.

En teoría, esto está bien explicado, así que echemos un vistazo al nuevo espacio de memoria a través del programa "fugado"...

PermGen vs. > Para comprender mejor el comportamiento en tiempo de ejecución del espacio de memoria Metaspace, creamos una clase de fuga de metadatos. El código fuente se puede descargar desde aquí.