Мониторинг на използването на диска и други показатели в Java

1. Общ преглед

В този бърз урок ще обсъдим как да наблюдаваме ключови показатели в Java. Ще се съсредоточим върху дисковото пространство, използването на паметта и данните за нишките - използвайки само основните API на Java .

В първия ни пример ще използваме класа File, за да запитваме конкретна информация за диска.

След това ще анализираме използването на паметта и информацията за процесора, като се потопим в класа ManagementFactory .

И накрая, ще се докоснем до това как да наблюдаваме тези ключови показатели по време на изпълнение с помощта на Java Profilers .

2. Въведение в клас на файлове

Най-просто казано, класът File представлява абстракция на файл или директория. Може да се използва за получаване на ключова информация за файловата система и поддържане на независимостта на операционната система по отношение на файловите пътища. В този урок ще използваме този клас, за да изследваме коренните дялове както на Windows, така и на Linux машини.

3. Управление фабрика

Java предоставя клас ManagementFactory като фабрика за получаване на управлявани компоненти (MXBeans), съдържащи конкретна информация за JVM . Ще разгледаме две в следните примери за код:

3.1. MemoryMXBean

В MemoryMXBean представлява интерфейс за управление на системата на паметта на JVM. На по време на работа, на JVM създава една инстанция на този интерфейс, който може да се извлече с помощта на ManagementFactory е getMemoryMXBean () метод.

3.2. ThreadMXBean

Подобно на MemoryMXBean , ThreadMXBean е интерфейсът за управление на нишковата система на JVM. Той може да бъде извикан с помощта на метода getThreadMXBean () и съдържа ключови данни относно нишките.

В следващите примери ще използваме ThreadMXBean, за да се доберем до класа ThreadInfo на JVM - който съдържа конкретна информация относно нишките, изпълнявани на JVM.

3. Мониторинг на използването на диска

В този пример за код ще използваме класа File, за да съдържаме ключова информация за дяловете. Следващият пример ще върне свободното, общото и наличното пространство от устройството C: на машина с 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)); 

По същия начин можем да върнем същата информация за основната директория на 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)); 

Горният код отпечатва общото, свободно и използваемо пространство за дефинирания файл. По подразбиране горните методи предоставят броя на байтовете. Преобразувахме тези байтове в гигабайта, за да направим резултата много по-четлив за хората.

4. Мониторинг на използването на паметта

Сега ще използваме класа ManagementFactory, за да запитаме паметта, достъпна за JVM, като извикаме MemoryMXBean .

В този пример ще се съсредоточим предимно върху заявките за куп памет. Важно е да се отбележи, че паметта, която не е в купчина, също може да бъде заявена чрез 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)); 

Горният пример връща съответно първоначалната, използваната, максималната и ангажираната памет. Ето кратко обяснение какво означава това:

  • Initial: Първоначална памет, която JVM иска от операционната система по време на стартиране
  • Използвано: Текущото количество памет, използвано от JVM
  • Max: Максималната памет, достъпна за JVM. Ако тази граница бъде достигната, може да бъде хвърлен OutOfMemoryException
  • Ангажиран: Количеството памет, гарантирано достъпно за JVM

5. Използване на процесора

След това ще използваме ThreadMXBean, за да получим изчерпателен списък на ThreadInfo обекти и да ги запитаме , за да получим полезна информация относно текущите нишки, изпълнявани в 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))); } 

Първо, кодът получава списък с текущи нишки, използвайки метода getAllThreadIds . След това за всяка нишка извежда името и състоянието на нишката, последвано от времето на процесора за нишката в наносекунди.

6. Наблюдение на метрики с помощта на профили

И накрая, заслужава да се спомене, че можем да наблюдаваме тези ключови показатели, без да използваме никакъв Java код . Java Profilers наблюдават отблизо ключови конструкции и операции на ниво JVM и предлагат анализ в реално време на паметта, нишките и други.

VisualVM е един такъв пример за Java профилатор и е свързан с JDK от Java 6. Много интегрирани среди за разработка (IDE) съдържат плъгини, които да използват профилатори, докато разработват нов код. Можете да научите повече за Java Profilers и VisualVM тук.

7. Заключение

В тази статия се спряхме на използването на основните API на Java за заявка на ключова информация за използването на диска, управлението на паметта и информацията за нишките.

Разгледахме множество примери за използване на класовете File и ManagmentFactory за получаване на тези показатели.