一个Java应用程序能否在同一台Linux机器上监视另一个Java应用程序?

在Linux机器上,我有一个现有的第三方Java应用程序正在运行。 我可以通过进入/ proc / PID /目录(内存,线程等)知道应用程序的实时状态。 不过,我想在同一台机器上运行一个独立的Java程序,而不使用JConsole或VisualVM(如生产环境)。 我search了JMX的主题。 但是,它只返回关于它自己的程序的信息,而不是我正在监视的第三方应用程序。 我对吗? 有没有办法做到这一点(除了parsing/ proc / PID /结果)? 谢谢!

按照这个build议,我写了一个简单的程序来做本地监听。 但是,我得到以下错误。 任何想法?

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 

这正是JMX的用途。 如果您运行的是Java 6或更高版本,那么每个Java应用程序都会自动公开以供JMX代理监视和管理 – 如果您使用的是早期版本,则需要在启动应用程序时设置系统属性。

您甚至可以使用JXM remote,在其他计算机上监视它,它使用RMI。

一些资源:

  • Oracle监视和管理指南
  • Visual VM文章

如果你在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是进程中的线程数。

对于我的第三方应用程序的本地监控,替换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。 内存和线程监视工作正常。 感谢所有的投入!