在我创建JMX连接后,有人可以给我一些关于如何获取JVM属性的指南吗?我需要以编程方式获取这些信息。 我没有得到任何暗示就搜索了这个。 任何想法都将不胜感激。
答案 0 :(得分:2)
您可以从RuntimeMXBean获取所需的属性。
答案 1 :(得分:0)
我认为最小的例子应该是这样的:
public class JMXSystemProperties {
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
TabularDataSupport data = (TabularDataSupport) mbsc.getAttribute(new ObjectName("java.lang:type=Runtime"), "SystemProperties");
for (Entry<Object, Object> entry : data.entrySet()) {
CompositeDataSupport value = (CompositeDataSupport) entry.getValue();
System.out.println(entry.getKey() + " = " + value.values());
}
}
}
您仍然可以使用jvisualvm查看所有数据是否正确。
您可以将url中的localhost和端口9004替换为更适合您的服务器和端口。
由于
答案 2 :(得分:0)
作为提示:在连接到JMX之后,我认为有一个标准的MXBean
接口,它实现了java.lang.management.RuntimeMXBean
。相关的ObjectName
应为:
ObjectName objName = new ObjectName("java.lang:type=Runtime");
获取代理实例对象就是这样:
RuntimeMXBean runtimeMXBean = JMX.newMXBeanProxy(mbeanServer, objName, RuntimeMXBean.class, true);
也许这会帮助别人。
N.B。如果某人可以提供指向JMX系统RuntimeMXBean
接口需要的文档的链接,那将是受欢迎的。
答案 3 :(得分:0)
已经提供的答案中没有一个对我真正有用。我遇到了一些问题:
JMX.newMXBeanProxy
看起来很有希望避免所有此类拆包。但是,尽管它可以在运行时进行编译,但是我发现来自代理getSystemProperties
的结果实际上并没有正确地解压缩。它仍然是一个TabularDataSupport
对象(是的,即使它的编译时类型表明它应该是Map<String,String>
,实际上不是)。 所以这实际上对我有用,在解决了所有这些陷阱之后,它们为我提供了系统属性,就像您可能想要的那样Map<String,String>
。
package example;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.Map;
import java.util.Map.Entry;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class GetJmxSystemProps {
public static void main(String[] args) throws Exception {
JMXServiceURL serviceUrl = new JMXServiceURL("service:jmx:rmi://localhost:9111/jndi/rmi://localhost:9111/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
RuntimeMXBean proxy = ManagementFactory.getPlatformMXBean(connection, RuntimeMXBean.class);
Map<String, String> sysprops = proxy.getSystemProperties();
for (Entry<String, String> e : sysprops.entrySet()) {
System.out.println(e.getKey()+"="+e.getValue());
}
}
}
总结:这里的关键是使用JMX.newMXBeanProxy
获取类型为RuntimeMXBean
的bean是错误的,不能正确地将TabularDataSupport
对象解压缩到Map<String,String>
中。通过使用方法ManagementFactory.getPlatformMXBean
可以避免此问题。