Permgen vs Metaspace en Java

1. Introducción

En este tutorial rápido, examinaremos las diferencias entre las regiones de memoria de PermGen y Metaspace en el entorno Java.

Es importante tener en cuenta que, comenzando con Java 8, Metaspace reemplaza a PermGen, lo que trae algunos cambios sustanciales.

2. PermGen

PermGen (generación permanente) es un espacio de pila especial separado del montón de memoria principal .

La JVM realiza un seguimiento de los metadatos de clase cargados en PermGen. Además, la JVM almacena todo el contenido estático en esta sección de memoria. Esto incluye todos los métodos estáticos, variables primitivas y referencias a los objetos estáticos.

Además, contiene datos sobre códigos de bytes, nombres e información JIT . Antes de Java 7, String Pool también formaba parte de esta memoria. Las desventajas del tamaño fijo del grupo se enumeran en nuestro artículo.

El tamaño de memoria máximo predeterminado para JVM de 32 bits es 64 MB y 82 MB para la versión de 64 bits.

Sin embargo, podemos cambiar el tamaño predeterminado con las opciones de JVM:

  • -XX: PermSize = [size] es el tamaño inicial o mínimo del espacio PermGen
  • -XX: MaxPermSize = [size] es el tamaño máximo

Lo más importante es que Oracle eliminó por completo este espacio de memoria en la versión JDK 8. Por lo tanto, si usamos estos indicadores de ajuste en Java 8 y versiones más recientes, obtendremos las siguientes advertencias:

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 ...

Con su tamaño de memoria limitado, PermGen participa en la generación del famoso OutOfMemoryError . En pocas palabras, los cargadores de clases no se recolectaron correctamente y, como resultado, generaron una pérdida de memoria.

Por lo tanto, recibimos un error de espacio en la memoria; esto sucede principalmente en el entorno de desarrollo mientras se crean nuevos cargadores de clases.

3. Metaspacio

En pocas palabras, Metaspace es un nuevo espacio de memoria, a partir de la versión Java 8; ha reemplazado el espacio de memoria anterior de PermGen . La diferencia más significativa es cómo maneja la asignación de memoria.

Específicamente, esta región de memoria nativa crece automáticamente de forma predeterminada .

También tenemos nuevas banderas para afinar la memoria:

  • MetaspaceSize y MaxMetaspaceSize: podemos establecer los límites superiores de Metaspace.
  • MinMetaspaceFreeRatio: es el porcentaje mínimo de capacidad de metadatos de clase libre después de la recolección de basura
  • MaxMetaspaceFreeRatio : es el porcentaje máximo de capacidad de metadatos de clase libre después de una recolección de basura para evitar una reducción en la cantidad de espacio

Además, el proceso de recolección de basura también obtiene algunos beneficios de este cambio. El recolector de basura ahora activa automáticamente la limpieza de las clases muertas una vez que el uso de metadatos de clase alcanza su tamaño máximo de metadatos.

Por lo tanto, con esta mejora, JVM reduce la posibilidad de obtener el error OutOfMemory .

A pesar de todas estas mejoras, todavía necesitamos monitorear y ajustar el metaespacio para evitar pérdidas de memoria.

4. Resumen

En este artículo rápido, presentamos una breve descripción de las regiones de memoria de PermGen y Metaspace. Además, explicamos las diferencias clave entre cada uno de ellos.

PermGen todavía existe con JDK 7 y versiones anteriores, pero Metaspace ofrece un uso de memoria más flexible y confiable para nuestras aplicaciones.