Bewaken van schijfgebruik en andere statistieken in Java

1. Overzicht

In deze korte zelfstudie bespreken we hoe u belangrijke statistieken in Java kunt bewaken. We zullen ons concentreren op schijfruimte, geheugengebruik en threadgegevens - alleen met behulp van Java-kernAPI's.

In ons eerste voorbeeld maken we gebruik van de het dossier klasse om specifieke schijfinformatie op te vragen.

Vervolgens analyseren we het geheugengebruik en de processorinformatie door in het ManagementFactory klasse.

Ten slotte gaan we verder hoe u deze belangrijke metrische gegevens tijdens runtime kunt bewaken met behulp van Java Profilers.

2. Inleiding tot de het dossier Klasse

Simpel gezegd, de het dossier class vertegenwoordigt een abstractie van een bestand of directory. Het kan worden gebruikt verkrijg belangrijke informatie over het bestandssysteem en onderhoudOS-onafhankelijkheid met betrekking tot bestandspaden. In deze tutorial gebruiken we deze klasse om rootpartities op zowel Windows- als Linux-machines te onderzoeken.

3. ManagementFactory

Java biedt het ManagementFactory klasse als een fabriek voor het verkrijgen van beheerde bonen (MXBeans) metspecifieke informatie over de JVM. We zullen er twee onderzoeken in de volgende codevoorbeelden:

3.1. Geheugen MXBean

De MemoryMXBean vertegenwoordigt de beheerinterface voor het geheugensysteem van de JVM. Tijdens runtime maakt de JVM een enkele instantie van deze interface die we kunnen ophalen met behulp van de ManagementFactory‘S getMemoryMXBean () methode.

3.2. ThreadMXBean

gelijk aan Geheugen MXBean, ThreadMXBean is de beheerinterface voor het threadsysteem van de JVM. Het kan worden aangeroepen met de getThreadMXBean () methode en bevat belangrijke gegevens met betrekking tot threads.

In de volgende voorbeelden gebruiken we de ThreadMXBean om de JVM's te bemachtigen ThreadInfo class - die specifieke informatie bevat over threads die op de JVM worden uitgevoerd.

3. Schijfgebruik controleren

In dit codevoorbeeld gebruiken we de klasse File om belangrijke informatie over partities te bevatten. Het volgende voorbeeld retourneert de vrije, totale en beschikbare ruimte van station C: op een Windows-computer:

Bestand cDrive = nieuw bestand ("C:"); System.out.println (String.format ("Totale ruimte:% .2f GB", (dubbel) cDrive.getTotalSpace () / 1073741824)); System.out.println (String.format ("Vrije ruimte:% .2f GB", (dubbel) cDrive.getFreeSpace () / 1073741824)); System.out.println (String.format ("Bruikbare ruimte:% .2f GB", (dubbel) cDrive.getUsableSpace () / 1073741824)); 

Op dezelfde manier kunnen we dezelfde informatie retourneren voor de root-directory van een Linux-machine:

Bestand root = nieuw bestand ("/"); System.out.println (String.format ("Totale ruimte:% .2f GB", (dubbel) root.getTotalSpace () / 1073741824)); System.out.println (String.format ("Vrije ruimte:% .2f GB", (dubbel) root.getFreeSpace () / 1073741824)); System.out.println (String.format ("Bruikbare ruimte:% .2f GB", (dubbel) root.getUsableSpace () / 1073741824)); 

De bovenstaande code drukt de totale, vrije en bruikbare ruimte af voor het gedefinieerde bestand. Standaard leveren de bovenstaande methoden het aantal bytes. We hebben deze bytes omgezet in gigabytes om het resultaat veel beter leesbaar voor mensen te maken.

4. Bewaken van geheugengebruik

We zullen nu deManagementFactory klas naarvraag het geheugen op dat beschikbaar is voor de JVM door de Geheugen MXBean.

In dit voorbeeld zullen we ons voornamelijk richten op het opvragen van heap-geheugen. Het is belangrijk op te merken dat niet-heap-geheugen ook kan worden opgevraagd met Geheugen MX Bean:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean (); System.out.println (String.format ("Initieel geheugen:% .2f GB", (dubbel) geheugenMXBean.getHeapMemoryUsage (). GetInit () / 1073741824)); System.out.println (String.format ("Gebruikt heap-geheugen:% .2f GB", (dubbel) geheugenMXBean.getHeapMemoryUsage (). GetUsed () / 1073741824)); System.out.println (String.format ("Max heap-geheugen:% .2f GB", (dubbel) geheugenMXBean.getHeapMemoryUsage (). GetMax () / 1073741824)); System.out.println (String.format ("toegewezen geheugen:% .2f GB", (dubbel) geheugenMXBean.getHeapMemoryUsage (). GetCommitted () / 1073741824)); 

Het bovenstaande voorbeeld retourneert respectievelijk het initiële, gebruikte, max en toegewezen geheugen. Hier is een korte uitleg van wat dat betekent:

  • Initieel: Initieel geheugen dat de JVM opvraagt ​​van het besturingssysteem tijdens het opstarten
  • Gebruikt: de huidige hoeveelheid geheugen die door de JVM wordt gebruikt
  • Max: het maximale geheugen dat beschikbaar is voor de JVM. Als deze limiet is bereikt, wordt een OutOfMemoryException kan worden gegooid
  • Committed: de hoeveelheid geheugen die gegarandeerd beschikbaar is voor de JVM

5. CPU-gebruik

Vervolgens gebruiken we de ThreadMXBean voor een uitgebreide lijst met ThreadInfo objecten en vraag ze om te winnennuttige informatie over dehuidige discussies draait op de JVM.

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); voor (Lange threadID: threadMXBean.getAllThreadIds ()) {ThreadInfo info = threadMXBean.getThreadInfo (threadID); System.out.println ("Thread naam:" + info.getThreadName ()); System.out.println ("Thread State:" + info.getThreadState ()); System.out.println (String.format ("CPU-tijd:% s ns", threadMXBean.getThreadCpuTime (threadID))); } 

Ten eerste krijgt de code een lijst met huidige threads met behulp van de getAllThreadIds methode. Voor elke thread voert het vervolgens de naam en status van de thread uit, gevolgd door de CPU-tijd voor de thread in nanoseconden.

6. Metrische gegevens bewaken met behulp van profielen

Ten slotte is het de moeite waard om dat te vermelden we kunnen deze belangrijke statistieken volgen zonder Java-code te gebruiken. Java Profilers houden de belangrijkste constructies en bewerkingen op JVM-niveau nauwlettend in de gaten en bieden realtime analyse van geheugen, threads en meer.

VisualVM is zo'n voorbeeld van een Java-profiler en wordt sinds Java 6 met de JDK gebundeld. Veel geïntegreerde ontwikkelomgevingen (IDE) 's bevatten plug-ins om profilers te gebruiken tijdens het ontwikkelen van nieuwe code. U kunt hier meer leren over Java Profilers en VisualVM.

7. Conclusie

In dit artikel hebben we het gehad over het gebruik van Java-API's om belangrijke informatie over schijfgebruik, geheugenbeheer en threadinformatie op te vragen.

We hebben meerdere voorbeelden bekeken van het gebruik van de het dossier en ManagmentFactory klassen om deze metrische gegevens te verkrijgen.