O agente do ARMS coleta métricas da JVM em cinco categorias: memória, garbage collection (GC), threads, classes e descritores de arquivos. A obtenção de todas as métricas ocorre por meio das interfaces padrão de gerenciamento do JDK (java.lang.management) em intervalos regulares.
As seções a seguir detalham, para cada métrica, o método de coleta, o nome reportado, o tipo, a unidade, as dimensões e a API subjacente do JDK.
Métricas de memória
O agente do ARMS chama periodicamente ManagementFactory.getPlatformMXBeans(MemoryPoolMXBean.class) para obter o uso de memória de cada pool da JVM.
Cada MemoryPoolMXBean reporta os tamanhos inicial, máximo, committed e utilizado de um espaço de memória específico. Para consultar esses valores diretamente:
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());
}
}
Exemplo de saída (varia conforme a versão da 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
O agente reporta esses valores diretamente, sem processamento adicional.
Métricas reportadas
|
Métrica |
Tipo |
Unidade |
Descrição |
|
|
Gauge |
Bytes |
Tamanho inicial de memória solicitado pela JVM. |
|
|
Gauge |
Bytes |
Tamanho máximo de memória disponível. |
|
|
Gauge |
Bytes |
Memória committed à JVM pelo sistema operacional. |
|
|
Gauge |
Bytes |
Memória atualmente em uso. |
Dimensões
|
Dimensão |
Descrição |
Valores de exemplo |
|
|
Tipo de espaço de memória. |
|
|
|
Nome do espaço de memória. |
|
Para obter detalhes sobre os espaços de memória da JVM, consulte JVM memory details.
Métricas de GC
O método de coleta depende da versão do seu agente:
Antes da V4.4.0: Uma tarefa agendada consulta
ManagementFactory.getPlatformMXBeans(GarbageCollectorMXBean.class).V4.4.0 e posteriores: O agente assina eventos de GarbageCollectionNotificationInfo para coleta em tempo real.
Cada GarbageCollectorMXBean reporta contagens e durações acumuladas de GC desde a inicialização da JVM. Para consultar esses valores diretamente:
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());
}
}
Exemplo de saída (varia conforme a versão da JVM):
name=PS Scavenge gcCount=0 gcTime=0
name=PS MarkSweep gcCount=0 gcTime=0
Como esses valores são acumulados desde a inicialização da JVM, o agente calcula o delta entre coletas consecutivas (intervalo padrão: 15 segundos). Ele reporta as contagens e durações por intervalo.
Métricas reportadas
|
Métrica |
Tipo |
Unidade |
Descrição |
|
|
Gauge (delta) |
Contagem |
Número de ocorrências de GC no intervalo de coleta atual. |
|
|
Gauge (delta) |
Segundos |
Tempo de GC consumido no intervalo de coleta atual. |
Dimensões
|
Dimensão |
Descrição |
Valores de exemplo |
|
|
Tipo de geração do GC. |
|
|
|
Motivo do acionamento do GC (V4.4.0+). |
|
Mapeamento de nomes de garbage collectors
O agente do ARMS mapeia os nomes reais dos garbage collectors para valores padronizados da dimensão gen para simplificar a análise.
Coletores padrão
|
Nome do garbage collector |
**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 |
|
Coletores ZGC
O ZGC utiliza um design fundamentalmente diferente que não se encaixa na classificação tradicional young/old. O agente do ARMS mapeia os coletores ZGC separadamente:
|
Nome do garbage collector |
**Valor de |
|
ZGC Cycles |
|
|
ZGC Pauses |
|
|
ZGC Minor Cycles |
|
|
ZGC Minor Pauses |
|
|
ZGC Major Cycles |
|
|
ZGC Major Pauses |
|
Gráfico de uso de stack de threads
O console do ARMS exibe um gráfico de Thread Stack Usage. O agente não coleta essa métrica. Em vez disso, o valor corresponde à contagem atual de threads ativas multiplicada por 1 MB. Esse é o tamanho padrão de stack por thread que a JVM aloca para tabelas de variáveis locais, stacks de operandos, links dinâmicos e endereços de retorno de métodos.

Métricas de threads
O agente do ARMS chama periodicamente ManagementFactory.getThreadMXBean() para obter as contagens de threads.
A instância retornada de ThreadMXBean fornece a contagem acumulada de threads iniciadas, a contagem atual de threads ativas e a contagem de threads daemon. O agente também conta as threads ativas por estado: RUNNABLE, BLOCKED, WAITING e TIMED_WAITING.
Para consultar esses valores diretamente:
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);
}
Exemplo de saída (varia conforme a versão da JVM):
allStartedThreadCount=5 currentThreadCount=5 daemonThreadCount=4 terminatedThreadCount=0
A contagem de threads finalizadas equivale à contagem acumulada de threads iniciadas menos a contagem atual de threads ativas. Todos os outros valores vêm diretamente do ThreadMXBean. O agente reporta esses valores sem processamento adicional.
Métricas reportadas
|
Métrica |
Tipo |
Unidade |
Descrição |
|
|
Gauge |
Contagem |
Contagem de threads por estado. |
Dimensões
A dimensão state distingue as categorias de threads:
|
**Valor de |
Descrição |
|
|
Total de threads ativas. |
|
|
Threads daemon. |
|
|
Threads finalizadas (somente agente ARMS 4.x). |
|
|
Threads no estado NEW. |
|
|
Threads no estado RUNNABLE. |
|
|
Threads no estado BLOCKED. |
|
|
Threads no estado WAITING. |
|
|
Threads no estado TIMED_WAITING. |
Métricas de carregamento de classes
O agente do ARMS chama periodicamente ManagementFactory.getClassLoadingMXBean() para obter as contagens de carregamento de classes.
O ClassLoadingMXBean retornado fornece as contagens acumuladas de classes carregadas e descarregadas desde a inicialização da JVM. Para consultar esses valores diretamente:
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);
}
Exemplo de saída (varia conforme a versão da JVM):
totalLoadedClassCount=1355 unloadedClassCount=0
Como esses valores são acumulados desde a inicialização da JVM, o agente calcula o delta entre coletas consecutivas (intervalo padrão: 15 segundos) para reportar as contagens por intervalo.
Métricas reportadas
|
Métrica |
Tipo |
Unidade |
Descrição |
|
|
Gauge (delta) |
Contagem |
Número de classes carregadas no intervalo de coleta atual. |
|
|
Gauge (delta) |
Contagem |
Número de classes descarregadas no intervalo de coleta atual. |
Métricas de descritores de arquivos
O agente do ARMS chama periodicamente ManagementFactory.getOperatingSystemMXBean() para obter o uso de descritores de arquivos. Essa métrica está disponível apenas em sistemas baseados em Unix, onde o bean é uma instância de UnixOperatingSystemMXBean.
Para consultar esses valores diretamente:
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);
}
Exemplo de saída (varia conforme a versão da JVM):
openFDCount=184 fdOpenRatio=0.017969
A taxa de abertura é calculada como openFileDescriptorCount / maxFileDescriptorCount. O agente reporta esses valores sem processamento adicional.
Métricas reportadas
|
Métrica |
Tipo |
Unidade |
Descrição |
|
|
Gauge |
Contagem |
Número de descritores de arquivos atualmente abertos. |
|
|
Gauge |
Taxa (0-1) |
Proporção de descritores de arquivos abertos em relação ao máximo permitido. |