El agente de ARMS recopila métricas de la JVM en cinco categorías: memoria, recolección de basura (GC), hilos, clases y descriptores de archivo. Todas las métricas se obtienen de forma periódica mediante las interfaces de administración estándar del JDK (java.lang.management).
En las siguientes secciones se detalla el método de recopilación, el nombre reportado, el tipo, la unidad, las dimensiones y la API de JDK subyacente para cada métrica.
Métricas de memoria
El agente de ARMS llama periódicamente a ManagementFactory.getPlatformMXBeans(MemoryPoolMXBean.class) para obtener el uso de memoria de cada pool de memoria de la JVM.
Cada MemoryPoolMXBean reporta los tamaños inicial, máximo, confirmado (committed) y utilizado de un espacio de memoria específico. Para consultar estos valores directamente:
public static void printCurrentJVMMemoryUsage() {
List<MemoryPoolMXBean> beans = ManagementFactory.getPlatformMXBeans(MemoryPoolMXBean.class);
for (MemoryPoolMXBean bean : beans) {
System.out.printf("area=%s\tname=%s\tinitial=%d\tmax=%d\tcommited=%d\tuse=%d\n", bean.getType().name(),
bean.getName(), bean.getUsage().getInit(), bean.getUsage().getMax(), bean.getUsage().getCommitted(), bean.getUsage().getUsed());
}
}
Salida de ejemplo (varía según la versión de la JVM):
area=NON_HEAP name=Code Cache initial=2555904 max=134217728 commited=3211264 use=3139712
area=NON_HEAP name=Metaspace initial=0 max=-1 commited=8388608 use=7950584
area=NON_HEAP name=Compressed Class Space initial=0 max=1073741824 commited=1048576 use=919408
area=HEAP name=PS Eden Space initial=67108864 max=1409286144 commited=67108864 use=39057856
area=HEAP name=PS Survivor Space initial=11010048 max=11010048 commited=11010048 use=0
area=HEAP name=PS Old Gen initial=179306496 max=2863661056 commited=179306496 use=0
El agente reporta estos valores directamente sin procesamiento adicional.
Métricas reportadas
|
Métrica |
Tipo |
Unidad |
Descripción |
|
|
Gauge |
Bytes |
Tamaño de memoria inicial solicitado por la JVM. |
|
|
Gauge |
Bytes |
Tamaño máximo de memoria disponible. |
|
|
Gauge |
Bytes |
Memoria que el sistema operativo confirmó para la JVM. |
|
|
Gauge |
Bytes |
Memoria utilizada actualmente. |
Dimensiones
|
Dimensión |
Descripción |
Valores de ejemplo |
|
|
Tipo de espacio de memoria. |
|
|
|
Nombre del espacio de memoria. |
|
Para más información sobre los espacios de memoria de la JVM, consulte JVM memory details.
Métricas de GC
El método de recopilación depende de la versión del agente:
Antes de V4.4.0: una tarea programada consulta
ManagementFactory.getPlatformMXBeans(GarbageCollectorMXBean.class).V4.4.0 y posteriores: el agente se suscribe a eventos GarbageCollectionNotificationInfo para recopilar datos en tiempo real.
Cada GarbageCollectorMXBean reporta el conteo acumulativo de GC y su duración desde el inicio de la JVM. Para consultar estos valores directamente:
public static void printGC() {
List<GarbageCollectorMXBean> beans = ManagementFactory.getPlatformMXBeans(GarbageCollectorMXBean.class);
for (GarbageCollectorMXBean bean : beans) {
System.out.printf("name=%s\tgcCount=%d\tgcTime=%d\n", bean.getName(),
bean.getCollectionCount(), bean.getCollectionTime());
}
}
Salida de ejemplo (varía según la versión de la JVM):
name=PS Scavenge gcCount=0 gcTime=0
name=PS MarkSweep gcCount=0 gcTime=0
Dado que estos valores son acumulativos desde el inicio de la JVM, el agente calcula la diferencia entre dos recopilaciones consecutivas (intervalo predeterminado: 15 segundos). Así reporta el conteo y la duración correspondientes a cada intervalo.
Métricas reportadas
|
Métrica |
Tipo |
Unidad |
Descripción |
|
|
Gauge (delta) |
Count |
Número de ejecuciones de GC en el intervalo de recopilación actual. |
|
|
Gauge (delta) |
Seconds |
Tiempo consumido por el GC en el intervalo de recopilación actual. |
Dimensiones
|
Dimensión |
Descripción |
Valores de ejemplo |
|
|
Tipo de generación de GC. |
|
|
|
Motivo que desencadenó el GC (V4.4.0+). |
|
Asignación de nombres del recolector de basura
El agente de ARMS asigna los nombres reales del recolector de basura a valores estandarizados de la dimensión gen para simplificar el análisis.
Recolectores estándar
|
Nombre del recolector de basura |
**Valor de |
|
Copy |
|
|
G1 Young Gen |
|
|
G1 Old Gen |
|
|
G1 Young Generation |
|
|
G1 Old Generation |
|
|
ParNew |
|
|
ConMarkSweep |
|
|
ConcurrentMarkSweep |
|
|
PS Scavenge |
|
|
PS MarkSweep |
|
|
PS Serial |
|
|
MarkSweepCompact |
|
Recolectores ZGC
ZGC utiliza un diseño fundamentalmente distinto que no encaja en la clasificación tradicional young/old. Por ello, el agente de ARMS asigna los recolectores ZGC por separado:
|
Nombre del recolector de basura |
**Valor de |
|
ZGC Cycles |
|
|
ZGC Pauses |
|
|
ZGC Minor Cycles |
|
|
ZGC Minor Pauses |
|
|
ZGC Major Cycles |
|
|
ZGC Major Pauses |
|
Gráfica de uso de pila de hilos
La consola de ARMS muestra la gráfica Thread Stack Usage. El agente no recopila esta métrica; el valor equivale al conteo actual de hilos activos multiplicado por 1 MB. Este es el tamaño de pila predeterminado que la JVM asigna por hilo para las tablas de variables locales, las pilas de operandos, los enlaces dinámicos y las direcciones de retorno de métodos.

Métricas de hilos
El agente de ARMS llama periódicamente a ManagementFactory.getThreadMXBean() para obtener el conteo de hilos.
La instancia de ThreadMXBean devuelta proporciona el conteo acumulativo de hilos iniciados, el conteo actual de hilos activos y el conteo de hilos daemon. El agente también cuenta los hilos activos por estado: RUNNABLE, BLOCKED, WAITING y TIMED_WAITING.
Para consultar estos valores directamente:
public static void printThreads() {
ThreadMXBean threadMXBean = java.lang.management.ManagementFactory.getThreadMXBean();
int threadCount = threadMXBean.getThreadCount();
int daemonThreadCount = threadMXBean.getDaemonThreadCount();
long totalStartedThreadCount = threadMXBean.getTotalStartedThreadCount();
long terminatedThreadCount = totalStartedThreadCount - threadCount;
System.out.printf("allStartedThreadCount=%d\tcurrentThreadCount=%d\tdaemonThreadCount=%d\tterminatedThreadCount=%d\n"
, totalStartedThreadCount, threadCount, daemonThreadCount, terminatedThreadCount);
}
Salida de ejemplo (varía según la versión de la JVM):
allStartedThreadCount=5 currentThreadCount=5 daemonThreadCount=4 terminatedThreadCount=0
El conteo de hilos finalizados equivale al conteo acumulativo de hilos iniciados menos el conteo actual de hilos activos. Todos los demás valores provienen directamente de ThreadMXBean. El agente reporta estos valores sin procesamiento adicional.
Métricas reportadas
|
Métrica |
Tipo |
Unidad |
Descripción |
|
|
Gauge |
Count |
Conteo de hilos por estado. |
Dimensiones
La dimensión state distingue las categorías de hilos:
|
**Valor de |
Descripción |
|
|
Total de hilos activos. |
|
|
Hilos daemon. |
|
|
Hilos finalizados (solo agente de ARMS 4.x). |
|
|
Hilos en estado NEW. |
|
|
Hilos en estado RUNNABLE. |
|
|
Hilos en estado BLOCKED. |
|
|
Hilos en estado WAITING. |
|
|
Hilos en estado TIMED_WAITING. |
Métricas de carga de clases
El agente de ARMS llama periódicamente a ManagementFactory.getClassLoadingMXBean() para obtener el conteo de clases cargadas.
El ClassLoadingMXBean devuelto proporciona el conteo acumulativo de clases cargadas y descargadas desde el inicio de la JVM. Para consultar estos valores directamente:
public static void printCurrentJVMMemoryUsage() {
ClassLoadingMXBean classLoaderMXBean = ManagementFactory.getClassLoadingMXBean();
long totalLoadedClassCount = classLoaderMXBean.getTotalLoadedClassCount();
long unloadedClassCount = classLoaderMXBean.getUnloadedClassCount();
System.out.printf("totalLoadedClassCount=%d\tunloadedClassCount=%d\n"
, totalLoadedClassCount, unloadedClassCount);
}
Salida de ejemplo (varía según la versión de la JVM):
totalLoadedClassCount=1355 unloadedClassCount=0
Como estos valores son acumulativos desde el inicio de la JVM, el agente calcula la diferencia entre dos recopilaciones consecutivas (intervalo predeterminado: 15 segundos) para reportar el conteo correspondiente a cada intervalo.
Métricas reportadas
|
Métrica |
Tipo |
Unidad |
Descripción |
|
|
Gauge (delta) |
Count |
Número de clases cargadas en el intervalo de recopilación actual. |
|
|
Gauge (delta) |
Count |
Número de clases descargadas en el intervalo de recopilación actual. |
Métricas de descriptores de archivo
El agente de ARMS llama periódicamente a ManagementFactory.getOperatingSystemMXBean() para obtener el uso de descriptores de archivo. Esta métrica solo está disponible en sistemas basados en Unix, donde el bean es una instancia de UnixOperatingSystemMXBean.
Para consultar estos valores directamente:
public static void printFDUsage() {
OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
if (!(operatingSystemMXBean instanceof UnixOperatingSystemMXBean)) {
return;
}
long openFDCount = ((UnixOperatingSystemMXBean) operatingSystemMXBean).getOpenFileDescriptorCount();
long maxFDCount = ((UnixOperatingSystemMXBean) operatingSystemMXBean).getMaxFileDescriptorCount();
System.out.printf("openFDCount=%d\tfdOpenRatio=%f\n"
, openFDCount, (double) openFDCount / maxFDCount);
}
Salida de ejemplo (varía según la versión de la JVM):
openFDCount=184 fdOpenRatio=0.017969
La proporción de archivos abiertos se calcula como openFileDescriptorCount / maxFileDescriptorCount. El agente reporta estos valores sin procesamiento adicional.
Métricas reportadas
|
Métrica |
Tipo |
Unidad |
Descripción |
|
|
Gauge |
Count |
Número de descriptores de archivo abiertos actualmente. |
|
|
Gauge |
Ratio (0-1) |
Proporción de descriptores de archivo abiertos respecto al máximo permitido. |