我想以编程方式运行DiagnosticCommandMBean。
作为一个例子,我正在尝试使用vmFlags(),它不带任何参数。这是我的测试代码:
4 * 3 * 2 * 1 * fact 0 = 4 * 3 * 2 * 1 * 1 = 24
这给了我这个例外:
ObjectName name = new ObjectName("com.sun.management:type=DiagnosticCommand");
String port = System.getProperty("com.sun.management.jmxremote.port");
JMXServiceURL url =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:"+port+"/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
MBeanInfo info = ManagementFactory.getPlatformMBeanServer().getMBeanInfo(name);
mbsc.invoke(
name,
info.getOperations()[13].getName(), // vmFlags
null,
null
);
我做错了什么?
答案 0 :(得分:2)
在下面找到一个片段,它显示了一种更简单的方法(而不是通过RMI连接到正在运行的JVM)和mbeanServer.invoke(...)
方法的正确语法。
ObjectName objectName =new ObjectName("com.sun.management:type=DiagnosticCommand");
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
String operationName = "vmFlags";
Object[] params = new Object[1];
String[] signature = new String[]{String[].class.getName()};
String result = (String) mbeanServer.invoke(objectName, operationName,
params, signature);
System.out.printf("%s: %s%n", operationName, result);
输出(实际值替换为...
)
vmFlags: -XX:...