Перейти к основному содержимому

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

· 4 мин. чтения

1. Обзор

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

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

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

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

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

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

3. Фабрика управления

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

3.1. ПамятьMXBean

MemoryMXBean представляет собой интерфейс управления системой памяти JVM. Во время выполнения JVM создает один экземпляр этого интерфейса, который мы можем получить с помощью метода getMemoryMXBean () класса ManagementFactory . ``

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 Profilers и VisualVM можно узнать здесь .

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

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

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