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 для получения этих показателей.