Java Dark Memory: Class Space
Raúl González

Raúl González @raulgonzalez

About: Ingeniero informático. Javero con más de 25 años de experiencia. Más de 10 como Arquitecto de Soluciones diseñando arquitecturas para grandes clientes, siempre conservando pasión por la programación.

Joined:
Mar 9, 2025

Java Dark Memory: Class Space

Publish Date: Apr 2
0 0

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.

Image description

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.

Image description

3. Límites

A continuación podemos ver los diferentes flags de la JVM disponibles para este espacio:

Image description

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

Comments 0 total

    Add comment