我希望获取为第三方java进程/ JVM设置的系统属性。我需要以编程方式执行此操作。例如,获取“java.class.path”属性。我怎么能这样做?
我知道我们可以获取使用System.getProperty()编写的java程序的属性。但我需要获取第三方JVM的系统属性。我怎样才能获得相同的东西?
答案 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或主类一起使用。
则语法为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()
以获取所有系统参数。