Рубрики
Без рубрики

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

Краткое и практическое руководство по мониторингу ключевых показателей в Java.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы обсудим, как отслеживать ключевые показатели в Java. Мы сосредоточимся на дисковом пространстве, использовании памяти и потоковых данных – используя только основные API Java .

В нашем первом примере мы будем использовать класс File для запроса конкретной информации о диске.

Затем мы проанализируем использование памяти и информацию о процессоре, погрузившись в класс ManagementFactory .

Наконец, мы коснемся того, как отслеживать эти ключевые показатели во время выполнения с помощью профилировщиков Java .

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

Проще говоря, класс File представляет собой абстракцию файла или каталога. Его можно использовать для получения ключевой информации о файловой системе и поддержания | независимости ОС относительно путей к файлам. В этом уроке мы будем использовать этот класс для изучения корневых разделов как на компьютерах с Windows, так и на компьютерах с Linux.

3. ManagementFactory

Java предоставляет класс ManagementFactory в качестве фабрики для получения управляемых компонентов (Mbeans) , содержащих конкретную информацию о JVM . Мы рассмотрим два из них в следующих примерах кода:

3.1. MemoryMXBean

MemoryMXBean представляет интерфейс управления для системы памяти JVM. Во время выполнения JVM создает один экземпляр этого интерфейса, который мы можем получить с помощью метода ManagementFactory ‘s 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));

Приведенный выше пример возвращает начальную, используемую, максимальную и зафиксированную память соответственно. Вот краткое объяснение того, что это означает :

  • Начальная: Начальная память, которую JVM запрашивает у ОС во время запуска
  • Используется: текущий объем памяти, используемый JVM
  • Max: максимальная память, доступная для JVM. Если этот предел достигнут, может быть вызвано исключение OutOfMemoryException
  • Committed: объем памяти, гарантированный для 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 внимательно следят за ключевыми конструкциями и операциями на уровне JVM и предлагают анализ памяти, потоков и многого другого в режиме реального времени.

VisualVM является одним из таких примеров профилировщика Java и поставляется в комплекте с JDK начиная с Java 6. Многие интегрированные среды разработки (IDE)содержат плагины для использования профилировщиков при разработке нового кода. Вы можете узнать больше о профилировщиках Java и VisualVM здесь .

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

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

Мы рассмотрели несколько примеров использования классов File и Management Factory для получения этих показателей.