Praćenje upotrebe diska i drugih mjernih podataka u Javi

1. Pregled

U ovom brzom vodiču razgovarat ćemo o tome kako nadzirati ključne metrike u Javi. Usredotočit ćemo se na prostor na disku, upotreba memorije i podaci niti - koristeći samo osnovne Java API-je.

U našem prvom primjeru koristit ćemo Datoteka klasa za upit određenih podataka o disku.

Zatim ćemo analizirati upotrebu memorije i podatke o procesoru zaranjajući u Tvornica upravljanja razred.

Napokon ćemo se dotaknuti kako nadzirati ove ključne mjerne podatke tijekom izvođenja koristeći Java Profilers.

2. Uvod u Datoteka Razred

Jednostavno rečeno, Datoteka klasa predstavlja apstrakciju datoteke ili direktorij. Može se koristiti za dobiti ključne informacije o datotečnom sustavu i održavatiNeovisnost OS-a u vezi s putanjama datoteka. U ovom uputstvu koristit ćemo ovu klasu za ispitivanje root particija na Windows i Linux računalima.

3. Tvornica upravljanja

Java nudi Tvornica upravljanja razreda kao tvornica za dobivanje upravljanog graha (MXBeans) koji sadržespecifične informacije o JVM-u. Dvoje ćemo ispitati u sljedećim primjerima koda:

3.1. MemoryMXBean

The MemoryMXBean predstavlja sučelje za upravljanje za memorijski sustav JVM-a. Tijekom izvođenja, JVM stvara jednu instancu ovog sučelja koju možemo dohvatiti pomoću Tvornica upravljanja‘S getMemoryMXBean () metoda.

3.2. ThreadMXBean

Slično kao MemoryMXBean, ThreadMXBean je upravljačko sučelje za sustav niti JVM-a. To se može nazvati pomoću getThreadMXBean () metoda i sadrži ključne podatke u vezi s nitima.

U sljedećim primjerima koristit ćemo ThreadMXBean kako bi se dočepali JVM-a ThreadInfo klasa - koja sadrži specifične informacije o nitima pokrenutim na JVM-u.

3. Nadgledanje upotrebe diska

U ovom primjeru koda koristit ćemo klasu File da bismo sadržavali ključne informacije o particijama. Sljedeći će primjer vratiti slobodan, ukupan i dostupan prostor s pogona C: na Windows računalu:

Datoteka cDrive = nova datoteka ("C:"); System.out.println (String.format ("Ukupni prostor:% .2f GB", (dvostruki) cDrive.getTotalSpace () / 1073741824)); System.out.println (String.format ("Slobodan prostor:% .2f GB", (dvostruko) cDrive.getFreeSpace () / 1073741824)); System.out.println (String.format ("Korisni prostor:% .2f GB", (dvostruki) cDrive.getUsableSpace () / 1073741824)); 

Slično tome, možemo vratiti iste podatke za korijenski direktorij Linux stroja:

Korijen datoteke = nova datoteka ("/"); System.out.println (String.format ("Ukupni prostor:% .2f GB", (dvostruki) root.getTotalSpace () / 1073741824)); System.out.println (String.format ("Slobodan prostor:% .2f GB", (dvostruki) root.getFreeSpace () / 1073741824)); System.out.println (String.format ("Korisni prostor:% .2f GB", (dvostruki) root.getUsableSpace () / 1073741824)); 

Gornji kod ispisuje ukupan, besplatan i korisni prostor za definiranu datoteku. Prema zadanim postavkama, gore navedene metode daju broj bajtova. Pretvorili smo ove bajtove u gigabajte kako bismo rezultat učinili mnogo čitljivijim.

4. Praćenje upotrebe memorije

Sad ćemo koristitiTvornica upravljanja razred doupitajte memoriju koja je dostupna JVM-u pozivajući MemoryMXBean.

U ovom ćemo se primjeru prvenstveno usredotočiti na ispitivanje hrpe memorije. Važno je napomenuti da se memorija koja ne sadrži hrpu također može pitati pomoću MemoryMXBean:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean (); System.out.println (String.format ("Početna memorija:% .2f GB", (dvostruka) memoryMXBean.getHeapMemoryUsage (). GetInit () / 1073741824)); System.out.println (String.format ("Korištena memorija hrpe:% .2f GB", (dvostruka) memoryMXBean.getHeapMemoryUsage (). GetUsed () / 1073741824)); System.out.println (String.format ("Max memorija hrpe:% .2f GB", (dvostruka) memoryMXBean.getHeapMemoryUsage (). GetMax () / 1073741824)); System.out.println (String.format ("Posvećena memorija:% .2f GB", (dvostruka) memoryMXBean.getHeapMemoryUsage (). GetCommitted () / 1073741824)); 

Gornji primjer vraća početnu, korištenu, maksimalnu i dodijeljenu memoriju. Evo kratkog objašnjenja što to znači:

  • Inicijalno: Inicijalna memorija koju JVM zahtijeva od OS-a tijekom pokretanja
  • Korišteno: trenutna količina memorije koju koristi JVM
  • Max: Maksimalna memorija dostupna JVM-u. Ako se dosegne ovo ograničenje OutOfMemoryException može biti bačen
  • Predano: Zajamčena količina memorije dostupna JVM-u

5. Korištenje CPU-a

Dalje ćemo koristiti ThreadMXBean dobiti sveobuhvatan popis ThreadInfo predmeti i pitajte ih da steknukorisne informacije u vezi strenutne niti trčanje na JVM-u.

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); for (Long threadID: threadMXBean.getAllThreadIds ()) {ThreadInfo info = threadMXBean.getThreadInfo (threadID); System.out.println ("Naziv teme:" + info.getThreadName ()); System.out.println ("Stanje niti:" + info.getThreadState ()); System.out.println (String.format ("CPU vrijeme:% s ns", threadMXBean.getThreadCpuTime (threadID))); } 

Prvo, kod dobiva popis trenutnih niti pomoću getAllThreadIds metoda. Za svaku nit tada izbacuje ime i stanje niti nakon čega slijedi procesorsko vrijeme niti u nanosekundama.

6. Praćenje metrike pomoću profilara

Napokon, vrijedi to spomenuti te ključne mjerne podatke možemo nadzirati bez upotrebe Java koda. Java Profileri pomno prate ključne konstrukcije i operacije na razini JVM-a i nude analizu memorije, niti i još mnogo toga u stvarnom vremenu.

VisualVM je jedan od takvih primjera Java Profilera i u paketu je s JDK od Jave 6. Mnoga integrirana razvojna okruženja (IDE) sadrže dodatke koji koriste profilere tijekom razvijanja novog koda. Ovdje možete saznati više o Java Profilers i VisualVM.

7. Zaključak

U ovom smo članku dotaknuli upotrebu jezgre Java API-ja za postavljanje upita o ključnim informacijama o upotrebi diska, upravljanju memorijom i informacijama o nitima.

Pregledali smo više primjera korištenja Datoteka i ManagmentFactory razreda za dobivanje ovih mjernih podataka.