Как инструмент JPS получает имя основного класса или jar, который он выполняет

1

Мне интересно, как инструмент JPS получает имя основного класса, которое выполняется в процессе jvm. это

jps -l
123   package.MainClass
456   /path/example.jar

Я говорю конкретно о Linux (меня не интересует Windows, и у меня нет машины Win для экспериментов).

Я мог бы думать о 2 способах

  1. Подключение к JVM, о котором идет речь,
  2. Из файловой системы /proc

Что касается первого варианта, использует ли он локальное соединение JMX? Тем не менее, он должен перейти в /proc для pids.

  1. Существует PID, поэтому он должен спросить OS в любом случае
  2. jps перечисляет также сам

Что касается второго варианта, я считаю, что это может быть правильным, потому что

  1. В командной строке есть либо -jar либо MainClass
  2. /proc хорошо знает PID
  3. Прежде чем jps начнет что-то делать, у него есть собственная папка в /proc

Но здесь я столкнулся с небольшой проблемой. Когда команда java очень длинная (например, существует чрезвычайно длинный параметр -classpath), информация о командной строке не помещается в пространство, зарезервированное для нее в /proc. Моя система имеет 4 КБ для этого, и то, что я узнал в другом месте, это связано с OS-кодом (для его изменения требуется компиляция ядра). Однако даже в этом случае jps все еще может получить этот основной класс. Как?

Мне нужно найти более быстрый способ получить JVM-процесс, чем вызов jps. Когда система достаточно загружена (например, при запуске нескольких JVM), jps застрял в течение нескольких секунд (я видел, что он ждет ~ 30 секунд).

Теги:
jvm

1 ответ

3
Лучший ответ

jps просматривает jps /tmp/hsperfdata_<username>/<pid> которые содержат мониторы и счетчики запуска JVM. Монитор с именем sun.rt.javaCommand содержит строку, которую вы ищете.

Чтобы узнать формат файла PerfData, вам нужно будет изучить исходный код JDK.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню