Overvågning af diskbrug og andre metrics i Java

1. Oversigt

I denne hurtige vejledning diskuterer vi, hvordan du overvåger nøglemålinger i Java. Vi fokuserer på diskplads, hukommelsesforbrug og tråddata - kun ved hjælp af Java API'er.

I vores første eksempel bruger vi Fil klasse til forespørgsel på specifik diskinformation.

Derefter analyserer vi hukommelsesforbrug og processorinformation ved at dykke ned i ManagementFabrik klasse.

Endelig vil vi røre ved hvordan man overvåger disse nøglemålinger ved kørsel ved hjælp af Java-profiler.

2. Introduktion til Fil Klasse

Kort sagt, den Fil klasse repræsenterer en abstraktion af en fil eller bibliotek. Det kan bruges til få nøgleoplysninger om filsystemet og vedligeholdOS uafhængighed vedrørende filstier. I denne vejledning bruger vi denne klasse til at undersøge rodpartitioner på både Windows- og Linux-maskiner.

3. ManagementFabrik

Java leverer ManagementFabrik klasse som en fabrik til at få styrede bønner (MXBeans) indeholdendespecifikke oplysninger om JVM. Vi undersøger to i følgende kodeeksempler:

3.1. MemoryMXBean

Det MemoryMXBean repræsenterer styringsgrænsefladen til hukommelsessystemet til JVM. På runtime opretter JVM en enkelt forekomst af denne grænseflade, som vi kan hente ved hjælp af ManagementFabrik'S getMemoryMXBean () metode.

3.2. TrådMXBønne

På samme måde som MemoryMXBean, TrådMXBønne er styringsgrænsefladen til trådsystemet til JVM. Det kan kaldes ved hjælp af getThreadMXBean () metode og indeholder nøgledata vedrørende tråde.

I de følgende eksempler bruger vi TrådMXBønne for at få fat i JVM'erne ThreadInfo klasse - som indeholder specifikke oplysninger om tråde, der kører på JVM.

3. Overvågning af diskbrug

I dette kodeeksempel bruger vi filklassen til at indeholde nøgleoplysninger om partitioner. Følgende eksempel returnerer det ledige, samlede og tilgængelige plads fra C: -drevet på en Windows-maskine:

Fil cDrive = ny fil ("C:"); System.out.println (String.format ("Samlet plads:% .2f GB", (dobbelt) cDrive.getTotalSpace () / 1073741824)); System.out.println (String.format ("Ledig plads:% .2f GB", (dobbelt) cDrive.getFreeSpace () / 1073741824)); System.out.println (String.format ("Brugbar plads:% .2f GB", (dobbelt) cDrive.getUsableSpace () / 1073741824)); 

På samme måde kan vi returnere de samme oplysninger til rodmappe på en Linux-maskine:

File root = ny fil ("/"); System.out.println (String.format ("Samlet plads:% .2f GB", (dobbelt) root.getTotalSpace () / 1073741824)); System.out.println (String.format ("Ledig plads:% .2f GB", (dobbelt) root.getFreeSpace () / 1073741824)); System.out.println (String.format ("Brugbar plads:% .2f GB", (dobbelt) root.getUsableSpace () / 1073741824)); 

Ovenstående kode udskriver det samlede, ledige og brugbare plads til den definerede fil. Ovenstående metoder angiver som standard antallet af byte. Vi har konverteret disse byte til gigabyte for at gøre resultatet meget mere menneskeligt læsbart.

4. Overvågning af hukommelsesbrug

Vi bruger nuManagementFabrik klasse tilforespørg den tilgængelige hukommelse til JVM ved at ringe til MemoryMXBean.

I dette eksempel vil vi primært fokusere på forespørgsel på bunkehukommelse. Det er vigtigt at bemærke, at ikke-heap-hukommelse også kan forespørges ved hjælp af MemoryMXBean:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean (); System.out.println (String.format ("Initial memory:% .2f GB", (double) memoryMXBean.getHeapMemoryUsage (). GetInit () / 1073741824)); System.out.println (String.format ("Brugt bunkehukommelse:% .2f GB", (dobbelt) 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)); 

Ovenstående eksempel returnerer henholdsvis den indledende, brugte, maksimale og dedikerede hukommelse. Her er en kort forklaring på, hvad det betyder:

  • Initial: Indledende hukommelse, som JVM anmoder om fra operativsystemet under opstart
  • Brugt: Den aktuelle mængde hukommelse, der bruges af JVM
  • Max: Den maksimale hukommelse, der er tilgængelig for JVM. Hvis denne grænse er nået en OutOfMemoryException kan blive kastet
  • Forpligtet: Den mængde hukommelse, der garanteret er tilgængelig for JVM

5. CPU-brug

Dernæst bruger vi TrådMXBønne for at få en omfattende liste over ThreadInfo genstande og spørg dem for at vindenyttige oplysninger omaktuelle tråde kører på JVM.

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); for (Long threadID: threadMXBean.getAllThreadIds ()) {ThreadInfo info = threadMXBean.getThreadInfo (threadID); System.out.println ("Trådnavn:" + info.getThreadName ()); System.out.println ("Trådtilstand:" + info.getThreadState ()); System.out.println (String.format ("CPU-tid:% s ns", threadMXBean.getThreadCpuTime (threadID))); } 

For det første får koden en liste over aktuelle tråde ved hjælp af getAllThreadIds metode. For hver tråd udsender den derefter navnet og tilstanden af ​​tråden efterfulgt af CPU-tiden for tråden i nanosekunder.

6. Overvågning af målinger ved hjælp af profiler

Endelig er det værd at nævne det Vi kan overvåge disse nøglemålinger uden at bruge nogen Java-kode. Java Profilers overvåger nøje konstruktioner og operationer på JVM-niveau og tilbyder realtidsanalyse af hukommelse, tråde og mere.

VisualVM er et sådant eksempel på en Java-profil og er blevet bundtet med JDK siden Java 6. Mange integrerede udviklingsmiljøer (IDE) indeholder plugins til at udnytte profiler, mens de udvikler ny kode. Du kan lære mere om Java-profiler og VisualVM her.

7. Konklusion

I denne artikel har vi rørt ved hjælp af centrale Java API'er til at forespørge nøgleoplysninger om diskbrug, hukommelsesstyring og trådinformation.

Vi har set på flere eksempler på brug af Fil og ManagmentFactory klasser for at opnå disse målinger.


$config[zx-auto] not found$config[zx-overlay] not found