Как перечислить все потоки хостовой ОС из виртуальной машины Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как перечислить все потоки хостовой ОС из виртуальной машины Java?

Сообщение Anonymous »

Есть ли в стандартной библиотеке Java какой-либо API, с помощью которого внутри JVM можно выполнить некоторый Java-код, в котором перечислены все потоки операционной системы хоста, на которой работает JVM?
В частности, я хочу перечислить не все потоки Java JVM, выполняющие мой Java-код, а список потоков операционной системы хост-системы, в которой хост-процесс, запускающий JVM, является лишь одним из потоков ОС. Поэтому мне нужен список потоков ОС, аналогичный тому, который команда Linux top покажет при запуске кода Java.
В лучшем случае есть способ, позволяющий из Java запросить идентификатор потока ОС, который запускает JVM, в которой выполняется код Java для получения списка всех этих потоков ОС. Это понадобится для некоторой балансировки нагрузки, которую я хотел бы реализовать для Java.
ОБНОВЛЕНИЕ:
А пока я нашел гиперический сигар, который вызывает библиотеки, написанные для Windows и Linux. К сожалению, у меня происходит сбой, и, похоже, его выпуск прекращен.
Находясь в Windows, я загружаю Sigar Windows DLL. У меня работает вызов «System.loadLibrary» (сбой, пока он не заработал):

Код: Выделить всё

static {
System.loadLibrary("sigar-amd64-winnt");
}
Но запуск кода из sigar.jar приводит к дампу стека:

Код: Выделить всё

public static void main(String[] args) throws SigarException {
var sigar = new Sigar();
var list = sigar.getCpuList();
for(var cpu : list) {
System.out.println(cpu);
}
}
Но затем выполнение «sigar.getCpuList()» приводит к сбою:

Кадры 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»