Monitorando o uso do disco e outras métricas em Java
1. Visão geral
Neste tutorial rápido, discutiremos como monitorar as principais métricas em Java. Vamos nos concentrar emdisk space, memory usage, and thread data – using only core Java APIs.
Em nosso primeiro exemplo, usaremos a classeFile para consultar informações específicas do disco.
Em seguida, analisaremos o uso de memória e as informações do processador, mergulhando na classeManagementFactory.
Finalmente, vamos tocar emhow to monitor these key metrics at runtime using Java Profilers.
2. Introdução à aulaFile
Simplificando,File class represents an abstraction of a file ou diretório. Pode ser usado paraobtain key information about the file system and maintainOS independence em relação aos caminhos de arquivo. Neste tutorial, usaremos esta classe para examinar as partições raiz em máquinas Windows e Linux.
3. ManagementFactory
Java provides the ManagementFactory class as a factory for getting managed beans (MXBeans)containingspecific information about the JVM. Examinaremos dois nos seguintes exemplos de código:
3.1. MemoryMXBean
OMemoryMXBean represents the management interface para o sistema de memória da JVM. No tempo de execução, a JVM cria uma única instância dessa interface que podemos recuperar usando o métodoManagementFactory'sgetMemoryMXBean().
3.2. ThreadMXBean
Da mesma forma queMemoryMXBean,ThreadMXBean é a interface de gerenciamento para o sistema de encadeamento da JVM. Ele pode ser chamado usando o métodogetThreadMXBean() e contém os principais dados relacionados aos threads.
Nos exemplos a seguir, usaremosThreadMXBean para colocar as mãos noThreadInfo class – which contains specific information regarding threads running on the JVM. da JVM
3. Monitorando o uso do disco
Neste exemplo de código, usaremos a classe File para conter informações importantes sobre as partições. O exemplo a seguir retornará o espaço livre, total e disponível da unidade C: em uma máquina Windows:
File cDrive = new File("C:");
System.out.println(String.format("Total space: %.2f GB",
(double)cDrive.getTotalSpace() /1073741824));
System.out.println(String.format("Free space: %.2f GB",
(double)cDrive.getFreeSpace() /1073741824));
System.out.println(String.format("Usable space: %.2f GB",
(double)cDrive.getUsableSpace() /1073741824));
Da mesma forma, podemos retornar as mesmas informações pararoot directory of a Linux machine:
File root = new File("/");
System.out.println(String.format("Total space: %.2f GB",
(double)root.getTotalSpace() /1073741824));
System.out.println(String.format("Free space: %.2f GB",
(double)root.getFreeSpace() /1073741824));
System.out.println(String.format("Usable space: %.2f GB",
(double)root.getUsableSpace() /1073741824));
O código acima imprime o espaço total, livre e utilizável para o arquivo definido. Por padrão, os métodos acima fornecem o número de bytes. Nós convertemos esses bytes em gigabytes para tornar o resultado muito mais legível por humanos.
4. Monitorando o uso da memória
Agora usaremos ManagementFactory class toquery the memory available to the JVM by calling the MemoryMXBean.
Neste exemplo, vamos nos concentrar principalmente na consulta de memória heap. É importante notar que a memória não heap também pode ser consultada usandoMemoryMXBean:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
System.out.println(String.format("Initial memory: %.2f GB",
(double)memoryMXBean.getHeapMemoryUsage().getInit() /1073741824));
System.out.println(String.format("Used heap memory: %.2f GB",
(double)memoryMXBean.getHeapMemoryUsage().getUsed() /1073741824));
System.out.println(String.format("Max heap memory: %.2f GB",
(double)memoryMXBean.getHeapMemoryUsage().getMax() /1073741824));
System.out.println(String.format("Committed memory: %.2f GB",
(double)memoryMXBean.getHeapMemoryUsage().getCommitted() /1073741824));
O exemplo acima retorna a memória inicial, usada, max e confirmada, respectivamente. Aqui está uma breve explicação do quemeans:
-
Inicial: Memória inicial que a JVM solicita do SO durante a inicialização
-
Usado: a quantidade atual de memória usada pela JVM
-
Máx: a memória máxima disponível para a JVM. Se este limite for atingido, umOutOfMemoryException pode ser lançado
-
Confirmado: A quantidade de memória garantida para estar disponível para a JVM
5. Utilização do CPU
A seguir, usaremos os objetosThreadMXBean to gain a comprehensive list of ThreadInfo equery them to gainuseful information regarding thecurrent threads em execução na JVM.
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
for(Long threadID : threadMXBean.getAllThreadIds()) {
ThreadInfo info = threadMXBean.getThreadInfo(threadID);
System.out.println("Thread name: " + info.getThreadName());
System.out.println("Thread State: " + info.getThreadState());
System.out.println(String.format("CPU time: %s ns",
threadMXBean.getThreadCpuTime(threadID)));
}
Em primeiro lugar, o código obtém uma lista de threads atuais usando o métodogetAllThreadIds . Para cada thread, ele gera o nome e o estado do thread, seguidos pelo tempo de CPU do thread em nanossegundos.
6. Monitorando métricas usando Profilers
Finalmente, vale a pena mencionar quewe can monitor these key metrics without using any Java code. Os Java Profilers monitoram de perto as principais construções e operações no nível da JVM e oferecem análise em tempo real da memória, threads e muito mais.
O VisualVM é um exemplo de perfil de Java e é fornecido com o JDK desde o Java 6. Muitos ambientes de desenvolvimento integrado (IDE) s contêm plug-ins para aproveitar os criadores de perfil durante o desenvolvimento de novo código. Você pode aprender mais sobre Java Profilers e VisualVMhere.
7. Conclusão
Neste artigo, falamos sobre o uso de APIs Java principais para consultar informações importantes sobre o uso de disco, gerenciamento de memória e informações de thread.
Vimos vários exemplos de uso deFile andManagmentFactory classes para obter essas métricas.