在Linux机器上,我运行了现有的第三方Java应用程序。 我可以通过转到/ proc / PID /目录(内存,线程等)来了解应用程序的实时状态。 但是,我想在同一台机器上运行一个单独的Java程序,而不使用JConsole或VisualVM(如生产环境)。 我搜索了JMX的主题。但是,它只返回有关其自身程序的信息,而不是我尝试监视的第三方应用程序。我对吗? 有没有办法做到这一点(解析/ proc / PID /结果除外)? 谢谢!
按照建议,我写了一个简单的程序来做本地监视器。但是,我收到以下错误。有什么想法吗?
String hostName = "xx.xx.xx.xx";
int portNum = xxxx;
try {
JMXServiceURL u = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + hostName + ":" + portNum + "/jmxrmi");
JMXConnector c = JMXConnectorFactory.connect(u);
}
catch (Exception e) {
e.printStackTrace();
}
------Output------
java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.NameNotFoundException: jmxrmi
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:338)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:207)
at test.main(test.java:57)
Caused by: javax.naming.NameNotFoundException: jmxrmi
at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:99)
at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:185)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1886)
at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1856)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:255)
... 3 more
答案 0 :(得分:1)
这正是JMX的用途。如果您运行的是Java 6或更高版本,则每个Java应用程序都会自动公开以供JMX代理监视和管理 - 如果您使用的是早期版本,则需要在启动应用程序时设置系统属性。
您甚至可以使用JXM遥控器从另一台计算机上监控它,该遥控器使用RMI。
一些资源:
答案 1 :(得分:0)
如果您在Linux中并且只需要CPU,内存和线程,则可以使用Runtime.getRuntime().exec()
作为参数传递linux命令ps -p <pid> -o pid,nlwp,pcpu,pmem --sort pcpu
。当然你还需要解析输出。它是这样的:
PID NLWP %CPU %MEM
1765 52 4.6 11.3
其中NLWP
是进程中的线程数。
答案 2 :(得分:0)
对于我的第三方应用程序的本地监控,替换 JMXServiceURL u = new JMXServiceURL(“service:jmx:rmi:/// jndi / rmi://”+ hostName +“:”+ portNum +“/ jmxrmi”); 通过 JMXServiceURL u = new JMXServiceURL(“service:jmx:rmi:/// jndi / rmi://”+ hostName +“:”+ portNum +“/ server”); 解决了javax.naming.NameNotFoundException:jmxrmi的问题。 内存和线程监控现在工作正常。 感谢所有的投入!