mja*_*ari 41 java jmx rmi localhost jconsole
我应该使用JMX连接到localhost jvm上的java程序.换句话说,我想开发一个JMX客户端来在localhost上配置java程序.
不建议使用JConsole!JConsole不适用,因为它是一般的JMX客户端,对主程序性能有负面影响.
oracle站点上的示例使用RMIConnector和host:port params,但我不知道:应该在哪里设置jmx端口?
JConsole有一个通过PID连接到java进程的选项.但我没有在JMX api中找到任何具有PID作为输入参数的方法.
Gra*_*ray 63
我们使用类似下面的内容以编程方式连接到我们的JMX服务器.您应该使用以下参数运行您的服务器:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.ssl=false
Run Code Online (Sandbox Code Playgroud)
要绑定到特定地址,您需要添加以下VM参数:
-Djava.rmi.server.hostname=A.B.C.D
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用JMX客户端代码连接到您的服务器,如下所示:
String host = "localhost"; // or some A.B.C.D
int port = 1234;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL serviceUrl = new JMXServiceURL(url);
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
try {
MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();
// now query to get the beans or whatever
Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
...
} finally {
jmxConnector.close();
}
Run Code Online (Sandbox Code Playgroud)
我们还有代码可以以编程方式将自己发布到VM参数之外的特定端口,但这比我想象的要多得多.
在连接"by pid"方面,据我所知,你需要使用Java6从Java土地上做到这一点.我没有使用以下代码,但它似乎工作.
List<VirtualMachineDescriptor> vms = VirtualMachine.list();
for (VirtualMachineDescriptor desc : vms) {
VirtualMachine vm;
try {
vm = VirtualMachine.attach(desc);
} catch (AttachNotSupportedException e) {
continue;
}
Properties props = vm.getAgentProperties();
String connectorAddress =
props.getProperty("com.sun.management.jmxremote.localConnectorAddress");
if (connectorAddress == null) {
continue;
}
JMXServiceURL url = new JMXServiceURL(connectorAddress);
JMXConnector connector = JMXConnectorFactory.connect(url);
try {
MBeanServerConnection mbeanConn = connector.getMBeanServerConnection();
Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
...
} finally {
jmxConnector.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我也是SimpleJMX包的作者,它可以很容易地启动JMX服务器并将bean发布到远程客户端.
// create a new server listening on port 8000
JmxServer jmxServer = new JmxServer(8000);
// start our server
jmxServer.start();
// register our lookupCache object defined below
jmxServer.register(lookupCache);
jmxServer.register(someOtherObject);
// stop our server
jmxServer.stop();
Run Code Online (Sandbox Code Playgroud)
它确实有一个客户端接口,但现在它没有任何通过PID查找进程的机制 - 仅支持主机/端口组合(2012年6月).
澄清一下,如果您只对获取本地 JMX 统计信息感兴趣,则不需要使用远程 api。只需使用java.lang.management.ManagementFactory
:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
memoryMXBean.getHeapMemoryUsage().getMax();
...
List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans();
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
60783 次 |
最近记录: |