一个Java应用程序可以在同一个Linux机器上监视另一个Java应用程序吗

时间:2013-10-10 16:59:20

标签: java linux monitor

在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

3 个答案:

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