Мне интересно, как инструмент JPS получает имя основного класса, которое выполняется в процессе jvm. это
jps -l
123 package.MainClass
456 /path/example.jar
Я говорю конкретно о Linux (меня не интересует Windows, и у меня нет машины Win для экспериментов).
Я мог бы думать о 2 способах
/proc
Что касается первого варианта, использует ли он локальное соединение JMX? Тем не менее, он должен перейти в /proc
для pids.
jps
перечисляет также самЧто касается второго варианта, я считаю, что это может быть правильным, потому что
-jar
либо MainClass
/proc
хорошо знает PIDjps
начнет что-то делать, у него есть собственная папка в /proc
Но здесь я столкнулся с небольшой проблемой. Когда команда java очень длинная (например, существует чрезвычайно длинный параметр -classpath
), информация о командной строке не помещается в пространство, зарезервированное для нее в /proc
. Моя система имеет 4 КБ для этого, и то, что я узнал в другом месте, это связано с OS-кодом (для его изменения требуется компиляция ядра). Однако даже в этом случае jps
все еще может получить этот основной класс. Как?
Мне нужно найти более быстрый способ получить JVM-процесс, чем вызов jps
. Когда система достаточно загружена (например, при запуске нескольких JVM), jps
застрял в течение нескольких секунд (я видел, что он ждет ~ 30 секунд).
jps
просматривает jps
/tmp/hsperfdata_<username>/<pid>
которые содержат мониторы и счетчики запуска JVM. Монитор с именем sun.rt.javaCommand
содержит строку, которую вы ищете.
Чтобы узнать формат файла PerfData, вам нужно будет изучить исходный код JDK.
/proc/___/cmdline
обсуждается здесь: stackoverflow.com/questions/199130/…jps
а такжеjstat
, но используя Python из файлов hsperfdata : blog.martinhynar.cz/2014/08/05/Reading-jvm-information.html