Este artículo es un anexo del artículo principal Java Dark Memory, para aportar detalle sobre este espacio concreto de memoria. En el artículo principal nos centramos en la observabilidad de espacios de memoria menos conocidos y más problemáticos.
Índice
1. ¿Qué es?
Este espacio, más conocido como Metaspace almacena meta-información de las clases (classloading)
Su espacio depende de la cantidad de clases cargadas, puede rondar entre los 150-250MB.
- Representación interna de una Java class
- Métodos con su bytecode
- Descriptores de campos (fields)
- Pools de constantes
- Symbols (constantes, strings, descriptores)
- Anotaciones
Este espacio está dividido en dos áreas: Metaspace y Compressed Class Space.
2. Observabilidad
- Con NMT podemos ver la cantidad de memoria virtual y residente/comiteada de todo el espacio.
- Con JMX y Mbeans podemos consultar información sobre este espacio y su estado.
- Con métricas Prometheus, como por ejemplo las emitidas por SpringBoot:
jvm_memory_<commited|used|max>_bytes {area=“nonheap”, id=“Metaspace|Compressed Class Space”}
- Con herramientas como Memory Analyzer (MAT), basadas en Eclipse, podemos obtener información detallada tras un HeapDump o un CoreDump.
3. Límites
A continuación podemos ver los diferentes flags de la JVM disponibles para este espacio:
4. Consideraciones
- El tamaño de esta espacio sólo puede determinarse tras la observación en runtime. Debemos observar y medir en carga sostenida y ver el espacio máximo que necesita nuetra aplicación para poder por nuestro límite.
- Muchos frameworks modernos “crean” clases en runtime, lo que puede complicar el ajuste
- Es aconsejable dejar un margen "holgado" para este espacio. Los frameworks modernos crean código en runtime, classes, interfaces y proxies que irán llenando este espacio.
- Si el espacio está limitado (max) y no se puede alojar una nueva clase, se lanzará una RuntimeException
java.lang.OutOfMemoryError: Metaspace/Compressed Class Space