Если вы когда-нибудь задумывались, что такое OSHI Core и почему вокруг него столько шума, особенно в контексте Java-разработки и даже Minecraft, то вы попали по адресу! В этом посте мы разберём, что такое OSHI, зачем он нужен, как он помогает Java-разработчикам получать информацию о системе и железе, и как его использовать в своих проектах — будь то Minecraft-мод или что-то более серьёзное.


Что такое OSHI и какую проблему он решает

OSHI (Operating System and Hardware Information) — это библиотека на Java, которая позволяет получить подробную информацию о вашей операционной системе и аппаратном обеспечении. Представьте, что вы — детектив, который хочет узнать всё о компьютере, на котором запускается ваш код: сколько ядер у процессора, сколько памяти свободно, какие диски подключены, какие датчики температуры работают и даже состояние батареи.

И вот тут OSHI — ваш лучший друг! Он решает проблему кроссплатформенного доступа к системной информации без необходимости ставить дополнительные нативные библиотеки. Это значит, что вы можете писать Java-код, который одинаково хорошо работает на Windows, macOS, Linux, Android и даже на UNIX-системах вроде AIX или Solaris.


Как OSHI работает без установки нативных библиотек

Вы, наверное, думаете: "А как же он достаёт всю эту информацию без установки драйверов и прочего?" Всё дело в том, что OSHI использует JNA (Java Native Access) — механизм, который позволяет Java-коду вызывать нативные функции операционной системы напрямую, без сложной настройки.

Но есть и новинка — с выходом JDK 25 появился модуль oshi-core-java25, который использует FFM (Foreign Function & Memory API) — современный способ взаимодействия с нативным кодом, встроенный в Java. Это значит, что OSHI постепенно переходит от JNA к FFM, что улучшает производительность и безопасность.


JNA vs FFM: что выбрать и когда

Критерий JNA (oshi-core) FFM (oshi-core-java25)
Совместимость JDK 8 и выше JDK 25 и выше
Поддержка платформ Windows, macOS, Linux, Android, UNIX Пока ограничена JDK 25 сборками ОС
Производительность Хорошая Лучше, благодаря нативной интеграции
Стабильность Проверена временем В разработке, некоторые функции ещё на JNA
Простота миграции Широко используется Требует замены SystemInfo на SystemInfoFFM

Если ваш проект работает на JDK 25 и выше, и вы хотите быть на гребне волны, используйте FFM-модуль. Если же нужна стабильность и поддержка старых версий, оставайтесь на классическом JNA.


Поддерживаемые платформы и нюансы

OSHI официально поддерживает:

  • Windows
  • macOS
  • Linux и Android
  • UNIX-системы: AIX, FreeBSD, OpenBSD, Solaris

Однако, будьте готовы к нюансам:

  • На Android нужно добавить отдельный артефакт JNA (AAR) и исключить стандартный JAR.
  • Для Windows сенсорные данные (температура, вентиляторы) требуют дополнительной зависимости — jLibreHardwareMonitor.
  • Некоторые функции на новых платформах могут работать не полностью, пока не реализованы в FFM.

Основные точки входа в API OSHI

Чтобы начать использовать OSHI, создайте объект SystemInfo (или SystemInfoFFM для java25):

SystemInfo si = new SystemInfo(); // или new SystemInfoFFM() для java25
HardwareAbstractionLayer hal = si.getHardware();
CentralProcessor cpu = hal.getProcessor();

Через эти объекты вы можете получить:

Объект Что можно получить
SystemInfo Общая информация о системе и железе
HardwareAbstractionLayer Доступ к железу: CPU, память, диски, сенсоры
CentralProcessor Информация о процессоре: ядра, загрузка, время

Какие данные можно получить через OSHI

OSHI раскрывает богатый набор информации:

Категория Примеры данных
CPU Количество ядер, загрузка, частота
Память Общий объём, свободная память
Диски Модели, размер, чтение/запись
Сетевые интерфейсы IP-адреса, скорость передачи
Сенсоры Температура, скорость вентиляторов, напряжение
USB-устройства Подключённые устройства
Источники питания Состояние батареи, заряд, время работы
Операционная система Версия, время работы, процессы
Файловая система Типы, доступное и общее пространство

Практические примеры использования

Получение информации о процессоре и памяти

SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
CentralProcessor cpu = hal.getProcessor();

System.out.println("CPU логических ядер: " + cpu.getLogicalProcessorCount());
System.out.println("Средняя загрузка CPU: " + Arrays.toString(cpu.getSystemLoadAverage(3)));

GlobalMemory memory = hal.getMemory();
System.out.println("Общая память: " + memory.getTotal() / 1024 / 1024 + " MB");
System.out.println("Свободная память: " + memory.getAvailable() / 1024 / 1024 + " MB");

Получение информации о дисках и сетевых интерфейсах

List<HWDiskStore> disks = hal.getDiskStores();
for (HWDiskStore disk : disks) {
    System.out.println("Диск: " + disk.getModel() + ", размер: " + disk.getSize());
}

List<NetworkIF> networks = hal.getNetworkIFs();
for (NetworkIF net : networks) {
    System.out.println("Сеть: " + net.getName() + ", IP: " + Arrays.toString(net.getIPv4addr()));
}

Как добавить OSHI в проект

Для Maven:

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.9.0</version>
</dependency>

Для Gradle:

implementation 'com.github.oshi:oshi-core:6.9.0'

Если вы используете JDK 25 и хотите FFM-модуль:

implementation 'com.github.oshi:oshi-core-java25:6.9.0'

Особые заметки:

  • Для Android добавьте JNA AAR и исключите стандартный JNA.
  • Для Windows сенсоров — добавьте jLibreHardwareMonitor (обратите внимание на лицензию MPL 2.0).

Миграция с oshi-core на oshi-core-java25

  • Замените зависимость на oshi-core-java25.
  • Импортируйте oshi.SystemInfoFFM вместо oshi.SystemInfo.
  • Остальной API остаётся без изменений.
  • Учтите, что некоторые функции пока ещё используют старый JNA-бэкенд.

Ограничения и текущий статус

  • FFM-модуль пока поддерживает не все платформы и функции.
  • Некоторые методы всё ещё делегируют вызовы JNA.
  • Активно ведётся разработка и тестирование.
  • Сообщество приветствуется для помощи в тестах и коде.

Конфигурация и производительность

  • Конфигурация OSHI задаётся через файл oshi.properties или системные свойства Java.
  • Конфигурация не потокобезопасна и применяется при старте.
  • Для оптимальной производительности избегайте частых вызовов методов, которые делают системные запросы.
  • Подробности по производительности доступны в документации OSHI.

Где посмотреть примеры и документацию

  • GitHub OSHI — исходники, FAQ, примеры.
  • Javadoc OSHI 6.8.2 — API документация.
  • Демонстрации в артефакте oshi-demo с GUI и JSON-примерами.
  • Тесты в проекте, например, SystemInfoTest.java.

Лицензия и коммерческое использование

  • OSHI распространяется под лицензией MIT — свободно для коммерческого и открытого ПО.
  • Есть коммерческая поддержка через Tidelift.
  • Для безопасности у OSHI есть канал через Tidelift для сообщений о уязвимостях.

Итоговая таблица: что и как OSHI предоставляет

Категория Описание Пример использования
CPU Ядра, загрузка, время работы Мониторинг нагрузки в Minecraft-сервере
Память Общий и свободный объём Оптимизация использования памяти
Диски Модели, размер, чтение/запись Отслеживание доступного места
Сетевые интерфейсы IP, скорость передачи Логирование сетевой активности
Сенсоры Температура, вентиляторы Контроль температуры железа
USB-устройства Подключённые устройства Проверка наличия нужных устройств
Операционная система Версия, процессы Совместимость и диагностика
Файловая система Типы, доступное пространство Управление файлами и ресурсами

Заключение

OSHI — это мощный и удобный инструмент для Java-разработчиков, который позволяет получить всю необходимую информацию о системе и железе без головной боли с нативными библиотеками. Хотите сделать Minecraft-мод, который знает, сколько у пользователя памяти или температуру процессора? OSHI — ваш выбор!


Полезные ссылки


Теперь вы вооружены знаниями, чтобы использовать OSHI Core в своих Java-проектах и даже в Minecraft! Не бойтесь экспериментировать и заглядывать в системные недра вместе с OSHI!