Как программно получить системные свойства для конкретного экземпляра JVM? - PullRequest
10 голосов
/ 12 января 2012

Я хочу получить системные свойства, установленные для стороннего Java-процесса / JVM. Мне нужно сделать это программно. Например, получить свойство "java.class.path". Как я могу это сделать?

Я знаю, что мы можем получить свойства для Java-программы, которую мы пишем с помощью System.getProperty (). Но мне нужно получить системные свойства для сторонней JVM. Как я могу получить то же самое?

Ответы [ 3 ]

17 голосов
/ 12 января 2012

Если под сторонней JVM вы подразумеваете просто другую JVM, то вам следует попробовать jinfo . Это не будет работать со всеми реализациями JVM, но, скорее всего, оно есть или что-то подобное. jinfo принимает идентификатор процесса в качестве аргумента (или удаленную систему, см. man jinfo ). Чтобы найти идентификатор процесса, используйте jps или jps -v .

jinfo 74949
Attaching to process ID 74949, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.4-b02-402
Java System Properties:

java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Libraries
java.vm.version = 20.4-b02-402
awt.nativeDoubleBuffering = true
...
2 голосов
/ 24 июля 2018

Начиная с Java 7 , вы можете использовать команду jcmd , которая является частью JDK , так что она будет работать одинаково на всех ОС.

Может работать как с pid, так и с основным классом.

С pid целевой JVM

Синтаксис будет jcmd ${pid} VM.system_properties

Пример:

> jcmd 2125 VM.system_properties
2125:
#Tue Jul 24 18:05:39 CEST 2018
sun.desktop=windows
...

С именем класса

Синтаксис будет jcmd ${class-name} VM.system_properties

Пример:

> jcmd com.mycompany.MyProgram VM.system_properties
2125:
#Tue Jul 24 18:05:39 CEST 2018
sun.desktop=windows
...

Подробнее о , как использовать jcmd.

См. Также утилиту jcmd

0 голосов
/ 20 сентября 2017

Для программного доступа к статистике удаленной JVM (параметры системы JVM, статистика потоков, информация Memomy, информация GC и другая информация) можно использовать JMX . Для этого удаленная JVM должна разрешить соединение JMX ( Проверьте, как активировать JMX в удаленной JVM ). Как правило, вам необходимо установить следующие параметры -D в удаленной JVM с соответствующими значениями:

-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=127.0.0.1

Как только вышеуказанные настройки будут выполнены, подключитесь к порту JMX и получите различную информацию Mbean с удаленного сервера из вашего приложения: Ниже приведен пример кода:

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + HOST + ":" + PORT + "/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
MBeanServerConnection mbeanServerConnection = jmxConnector.getMBeanServerConnection();

С помощью этого mbeanServerConnection вы можете получить доступ к различным управляемым bean-компонентам и получить необходимую информацию от MX-bean-компонентов. Для системных свойств вам нужно получить bean-компонент RuntimeMXBean и вызвать getSystemProperties(), чтобы получить все системные параметры.

...