Какой API внутренне использует Java-инструмент jps? - PullRequest
4 голосов
/ 10 октября 2011

Мне нужно программно восстановить функциональные возможности инструмента 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 ]

7 голосов
/ 10 октября 2011

jps использует внутренний класс - MonitoredHost Oracle / Sun JRE. Метод activeVMs() используется для получения списка всех активных виртуальных машин на хосте. Вы можете обратиться к источнику sun.tools.jps.Jps класса OpenJDK, чтобы узнать, как инструмент jps работает под капотом.

4 голосов
/ 10 октября 2011

Это правильный API, в конечном итоге MonitoredHost # activeVMs () и VirtualMachine.list () используют один и тот же код обнаружения с помощью технологии jstat. Вы запускаете jps в командной строке от имени другого пользователя? В этом случае вы увидите разные JVM.

Смотрите здесь, как реализовано JPS .

1 голос
/ 10 октября 2011

вы можете сделать следующее: 1) Создание файлов сценариев для конкретной платформы (.bat для Windows, .sh для Linux и т. Д.) 2) Используйте команды "wmic process" (Windows), "ps -ef" (linux) и т. Д. В этих сценариях для вывода списка процессов (конвейер для получения результата для получения процессов Java). 3) Запустите вышеупомянутые сценарии с помощью API Runtime и получите результат вывода

...