В частности, я хочу перечислить не все потоки Java JVM, выполняющие мой Java-код, а список потоков операционной системы хост-системы, в которой хост-процесс, запускающий JVM, является лишь одним из потоков ОС. Поэтому мне нужен список потоков ОС, аналогичный тому, который команда Linux top покажет при запуске кода Java.
В лучшем случае есть способ, позволяющий из Java запросить идентификатор потока ОС, который запускает JVM, в которой выполняется код Java для получения списка всех этих потоков ОС. Это будет необходимо для некоторой балансировки нагрузки, которую я хотел бы реализовать для Java.
EDIT:
Тем временем я нашел гиперический сигар, который вызывает библиотеки, написанные для Windows и Linux. К сожалению, у меня происходит сбой, и, похоже, его выпуск прекращен.
Находясь в Windows, я загружаю Sigar Windows DLL. У меня работает вызов «System.loadLibrary» (сбой, пока он не заработал):
Код: Выделить всё
static {
System.loadLibrary("sigar-amd64-winnt");
}
Код: Выделить всё
public static void main(String[] args) throws SigarException {
var sigar = new Sigar();
var list = sigar.getCpuList();
for(var cpu : list) {
System.out.println(cpu);
}
}
Кадры Java: (J=скомпилирован Код Java, j=интерпретируемый, Vv=код VM)
j org.hyperic.sigar.Sigar.getCpuListNative()[Lorg/hyperic/sigar/Cpu;+0
j org.hyperic.sigar. Sigar.getCpuList()[Lorg/hyperic/sigar/Cpu;+1
j org.objectscape.Scratch.main([Ljava/lang/String;)V+9
v ~StubRoutines::call_stub
Похоже, что библиотека Windows больше не работает для новых JDK.
Думаю, есть способ для перечисления всех потоков ОС, на которых работает некоторая JVM, которая была добавлена в более новую версию JDK. Просто не могу его вспомнить и могу найти в Интернете...
РЕДАКТИРОВАТЬ 2:
Думаю, теперь я нашел способ сделать это:
var OperatingSystemMXBean = (com.sun.management.OperatingSystemMXBean)
ManagementFactory.getOperatingSystemMXBean();
System.out.println(operatingSystemMXBean.getSystemCpuLoad());
Процент загрузки ЦП, выводимый на консоль, находится примерно в определенном диапазоне что показывает диспетчер задач Windows. Таким образом, это значение кажется достаточно значимым для моих целей.
Я создал несколько потоков Java для вычисления высокого числа Фибоначчи, которое заставляет процессор достигать 100%. По какой-то причине при запуске SystemMXBean.getSystemCpuLoad() несколько секунд отображается 1.0, а затем еще секунды подряд 0.0, хотя диспетчер задач Windows по-прежнему показывает 100% и вентилятор работает довольно слышно. Немного странное поведение. Что ж, но я мог бы найти способ рассчитать какой-нибудь значимый прогноз для случая 100% нагрузки.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -a-java-vm
Мобильная версия