如何以编程方式获取特定JVM实例的系统属性?

时间:2012-01-12 10:29:44

标签: java properties jvm

我希望获取为第三方java进程/ JVM设置的系统属性。我需要以编程方式执行此操作。例如,获取“java.class.path”属性。我怎么能这样做?

我知道我们可以获取使用System.getProperty()编写的java程序的属性。但我需要获取第三方JVM的系统属性。我怎样才能获得相同的东西?

3 个答案:

答案 0 :(得分:17)

如果第三方JVM只是另一个JVM,那么你应该尝试 jinfo 。这不适用于所有JVM实现,但很可能有它或类似的东西。 jinfo 将进程ID作为参数(或远程系统,请参阅 man jinfo )。要查找进程ID,请使用 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
...

答案 1 :(得分:2)

从Java 7开始,您可以使用命令jcmd ,它是JDK的一部分,以便它在所有OS上都可以相同的方式工作。

它可以与pid或主类一起使用。

使用目标JVM的pid

则语法为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
...

有关how to use jcmd的更多详细信息。

另请参阅the jcmd Utility

答案 2 :(得分:0)

要以编程方式访问远程JVM统计信息(JVM系统参数,线程统计信息,Memomy信息,GC信息和其他信息),可以使用JMX。为此,远程JVM必须允许JMX连接(Check this on how to activate JMX in remote JVM)。基本上,您需要在远程JVM中设置以下-D参数并使用适当的值:

-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获取所需信息。对于系统属性,您需要获取RuntimeMXBean bean并调用getSystemProperties()以获取所有系统参数。