Monitoraggio dell'utilizzo del disco e di altre metriche in Java

1. Panoramica

In questo breve tutorial, discuteremo come monitorare le metriche chiave in Java. Ci concentreremo sullo spazio su disco, sull'utilizzo della memoria e sui dati dei thread, utilizzando solo API Java di base .

Nel nostro primo esempio, utilizzeremo la classe File per interrogare informazioni specifiche sul disco.

Quindi, analizzeremo l'utilizzo della memoria e le informazioni sul processore immergendoci nella classe ManagementFactory .

Infine, toccheremo come monitorare queste metriche chiave in fase di esecuzione utilizzando Java Profiler .

2. Introduzione alla classe di file

In poche parole, la classe File rappresenta un'astrazione di un file o di una directory. Può essere utilizzato per ottenere informazioni chiave sul file system e mantenere l' indipendenza del sistema operativo per quanto riguarda i percorsi dei file. In questo tutorial, useremo questa classe per esaminare le partizioni di root su macchine Windows e Linux.

3. ManagementFactory

Java fornisce la classe ManagementFactory come fabbrica per ottenere bean gestiti (MXBeans) contenenti informazioni specifiche sulla JVM . Ne esamineremo due nei seguenti esempi di codice:

3.1. MemoryMXBean

Il MemoryMXBean rappresenta l'interfaccia di gestione del sistema di memoria della JVM. Al tempo di esecuzione, la JVM crea una singola istanza di questa interfaccia, che siamo in grado di recuperare con il ManagementFactory s' getMemoryMXBean () metodo.

3.2. ThreadMXBean

Analogamente a MemoryMXBean , ThreadMXBean è l'interfaccia di gestione per il sistema di thread della JVM. Può essere chiamato utilizzando il metodo getThreadMXBean () e contiene i dati chiave relativi ai thread.

Nei seguenti esempi, utilizzeremo ThreadMXBean per mettere le mani sulla classe ThreadInfo della JVM, che contiene informazioni specifiche sui thread in esecuzione sulla JVM.

3. Monitoraggio dell'utilizzo del disco

In questo esempio di codice, useremo la classe File per contenere le informazioni chiave sulle partizioni. Il seguente esempio restituirà lo spazio libero, totale e disponibile dall'unità C: su una macchina 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)); 

Allo stesso modo, possiamo restituire le stesse informazioni per la directory principale di una macchina Linux :

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)); 

Il codice precedente stampa lo spazio totale, libero e utilizzabile per il file definito. Per impostazione predefinita, i metodi precedenti forniscono il numero di byte. Abbiamo convertito questi byte in gigabyte per rendere il risultato molto più leggibile dall'uomo.

4. Monitoraggio dell'utilizzo della memoria

Ora utilizzeremo la classe ManagementFactory per interrogare la memoria disponibile per JVM chiamando MemoryMXBean .

In questo esempio, ci concentreremo principalmente sull'esecuzione di query sulla memoria heap. È importante notare che anche la memoria non heap può essere interrogata utilizzando MemoryMXBean:

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)); 

L'esempio precedente restituisce rispettivamente la memoria iniziale, utilizzata, massima e impegnata. Ecco una breve spiegazione di cosa significa:

  • Iniziale: memoria iniziale che la JVM richiede al sistema operativo durante l'avvio
  • Usato: la quantità di memoria corrente utilizzata dalla JVM
  • Max: la memoria massima disponibile per JVM. Se questo limite viene raggiunto, può essere generata un'eccezione OutOfMemoryException
  • Impegnata: la quantità di memoria garantita per essere disponibile per la JVM

5. Utilizzo della CPU

Successivamente, utilizzeremo ThreadMXBean per ottenere un elenco completo di oggetti ThreadInfo e interrogarli per ottenere informazioni utili sui thread correnti in esecuzione sulla 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))); } 

In primo luogo, il codice ottiene un elenco di thread correnti utilizzando il metodo getAllThreadIds . Per ogni thread, quindi restituisce il nome e lo stato del thread seguito dal tempo della CPU per il thread in nanosecondi.

6. Monitoraggio delle metriche utilizzando i profiler

Infine, vale la pena ricordare che possiamo monitorare queste metriche chiave senza utilizzare alcun codice Java . I Java Profiler monitorano da vicino i costrutti e le operazioni chiave a livello di JVM e offrono analisi in tempo reale di memoria, thread e altro ancora.

VisualVM è uno di questi esempi di profiler Java ed è stato fornito in bundle con JDK da Java 6. Molti ambienti di sviluppo integrati (IDE) contengono plugin per sfruttare i profiler durante lo sviluppo di nuovo codice. Puoi saperne di più su Java Profiler e VisualVM qui.

7. Conclusione

In questo articolo, abbiamo accennato all'uso delle API Java principali per eseguire query sulle informazioni chiave sull'utilizzo del disco, sulla gestione della memoria e sulle informazioni sui thread.

Abbiamo esaminato diversi esempi di utilizzo delle classi File e ManagmentFactory per ottenere queste metriche.