2013-10-10 124 views
4

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

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

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 
+2

你可以修改要监控的程序吗?例如,通过网络传输统计数据(回送)相对​​简单。 – hexafraction

+0

想知道java进程是否正在运行?或更具体的东西。 – omainegra

+0

由于它是第三方产品,我无法修改现有的Java应用程序。我想监视它的内存使用情况,线程计数器等,并在百分比超过某个阈值时生成警报。 – user2867834

回答

1

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

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

一些资源:

+0

启用开箱即用管理 要使用JMX API监控Java平台,您必须执行以下操作。 启动Java VM时,启用JMX代理(平台MBean服务器的另一个名称)。您可以启用JMX代理: 本地监视,用于在本地系统上运行的客户端管理应用程序。 对远程系统上运行的客户端管理应用程序进行远程监视。 使用符合JMX规范的工具(如JConsole)监视Java VM。有关Console的更多信息,请参阅第3章,使用JConsole。 – user2867834

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是在这个过程中的线程数。

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。 现在内存和线程监控工作正常。 感谢您的所有投入!

相关问题