Какой API внутренне использует Java-инструмент jps?
Мне нужно программно воссоздать функциональность инструмента jps. Мне нужно выяснить все запущенные процессы Java вместе с их идентификатором, чтобы я мог подключиться к этому процессу (аналогично тому, что делает JConsole).
Я думал, что VirtualMachine API поможет, но не получил ожидаемого результата при запуске следующего
public class ProcessList {
public static void main(String[] args){
List<VirtualMachineDescriptor> vms = VirtualMachine.list();
for(VirtualMachineDescriptor vm : vms){
System.out.println (vm.id());
}
}
}
Когда я запускаю приведенный выше код, он возвращает только один идентификатор, но когда я запускаю jps на той же машине, я вижу несколько других процессов.
3 ответа
jps
использует внутренний класс - MonitoredHost
Оракула / Солнца JRE. activeVMs()
Метод используется для получения списка всех активных виртуальных машин на хосте. Вы можете обратиться к источнику sun.tools.jps.Jps
класс OpenJDK, чтобы узнать, как jps
Инструмент работает под капотом.
Это правильный API, в конечном счете MonitoredHost#activeVMs() и VirtualMachine.list() используют один и тот же код обнаружения с помощью технологии jstat. Вы запускаете jps в командной строке от имени другого пользователя? В этом случае вы увидите разные JVM.
Посмотрите здесь, как реализован JPS.
Вы можете сделать следующее: 1) Создать файлы сценариев для конкретной платформы (.bat для Windows, .sh для Linux и т. д.) 2) Использовать команды "wmic process"(Windows), "ps -ef"(linux) и т. д. в этих сценариях для вывода списка процессы (труба на результат, чтобы получить процессы Java). 3) Запустите вышеуказанные скрипты с помощью API Runtime и получите результат вывода