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

一个Java应用程序能否监视同一台Linux机器上的另一个Java应用程序?,java,linux,monitor,Java,Linux,Monitor,在Linux机器上,我有一个现有的第三方Java应用程序正在运行。 我可以通过进入/proc/PID/目录(内存、线程等)了解应用程序的实时状态。 但是,我希望在同一台机器上运行一个单独的Java程序,而不使用JConsole或VisualVM(如生产环境)。 我搜索了JMX的主题。但是,它只返回关于自己程序的信息,而不是我试图监视的第三方应用程序。我说得对吗? 有没有办法做到这一点(除了解析/proc/PID/result)? 谢谢 按照建议,我写了一个简单的程序来做本地监控。然而,我得到了以

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

按照建议,我写了一个简单的程序来做本地监控。然而,我得到了以下错误。有什么想法吗

    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从另一台计算机监视它,JXM remote在引擎盖下使用RMI

一些资源:


如果您在Linux中,只需要CPU、内存和线程,则可以使用
Runtime.getRuntime().exec()
将命令ps-p-opid、nlwp、pcpu、pmem--sort pcpu作为参数传递给Linux。当然,您仍然需要解析输出。是这样的:

PID   NLWP  %CPU  %MEM
1765   52    4.6  11.3

其中
NLWP
是进程中的线程数。

对于我的第三方应用程序的本地监视,替换 JMXServiceURL u=新的JMXServiceURL(“服务:jmx:rmi:///jndi/rmi://“+hostName+”:“+portNum+”/jmxrmi”); 通过 JMXServiceURL u=新的JMXServiceURL(“服务:jmx:rmi:///jndi/rmi://“+hostName+”:“+portNum+”/server”); 已解决javax.naming.NameNotFoundException:jmxrmi的问题。 内存和线程监视现在工作正常。
感谢所有的投入

您可以修改要监视的程序吗?例如,让它通过网络(环回)传输统计信息相对简单。想知道java进程是否正在运行吗?我不能修改现有的Java应用程序,因为它是第三方产品。我想监视它的内存使用情况、线程计数器等,并在百分比超过某个阈值时生成警报。启动Java VM时启用JMX代理(平台MBean服务器的另一个名称)。您可以为本地系统上运行的客户机管理应用程序启用JMX代理:本地监视。远程监控,用于在远程系统上运行的客户端管理应用程序。使用符合JMX规范的工具(如JConsole)监视Java虚拟机。有关控制台的更多信息,请参阅第3章,使用JConsole。