Мониторинг использования диска и других метрик в 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 для получения этих показателей.