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

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

1. обзор

В этом кратком руководстве мы обсудим, как отслеживать ключевые показатели в Java. Мы сосредоточимся наdisk space, memory usage, and thread data – using only core Java APIs.

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

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

Наконец, коснемсяhow to monitor these key metrics at runtime using Java Profilers.

2. Введение в классFile

Проще говоря,File class represents an abstraction of a file или directory. Его можно использовать дляobtain key information about the file system and maintainOS independence относительно путей к файлам. В этом руководстве мы будем использовать этот класс для изучения корневых разделов на компьютерах с Windows и Linux.

3. ManagementFactoryс

Java provides the ManagementFactory class as a factory for getting managed beans (MXBeans)containingspecific information about the JVM. В следующих примерах кода мы рассмотрим два:

3.1. MemoryMXBeanс

MemoryMXBean represents the management interface для системы памяти JVM. Во время выполнения JVM создает единственный экземпляр этого интерфейса, который мы можем получить с помощью методаManagementFactory ’sgetMemoryMXBean().

3.2. ThreadMXBeanс

ПодобноMemoryMXBean,ThreadMXBean - это интерфейс управления для системы потоков JVM. Его можно вызвать с помощью методаgetThreadMXBean(), и он содержит ключевые данные о потоках.

В следующих примерах мы будем использоватьThreadMXBean, чтобы получить доступ к JVMThreadInfo class – which contains specific information regarding threads running on the 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));

Точно так же мы можем вернуть ту же информацию дляroot directory of a Linux machine:

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 class toquery the memory available to the JVM by calling the 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));

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

  • Initial: начальная память, которую JVM запрашивает у ОС во время запуска

  • Используется: текущий объем памяти, используемый JVM

  • Макс. Максимальный объем памяти, доступный для JVM. Если этот предел достигнут, может быть брошеноOutOfMemoryException 

  • Committed: объем памяти, который гарантированно будет доступен JVM

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

Затем мы будем использовать объектыThreadMXBean to gain a comprehensive list of ThreadInfo иquery them to gainuseful information regarding thecurrent threads, запущенные на 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. Мониторинг показателей с помощью профилировщиков

Наконец, стоит упомянуть, чтоwe can monitor these key metrics without using any Java code. Профилировщики Java тщательно отслеживают ключевые конструкции и операции на уровне JVM и предлагают анализ памяти, потоков и многое другое в режиме реального времени.

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

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

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

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