在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
你可以修改要监控的程序吗?例如,通过网络传输统计数据(回送)相对简单。 – hexafraction
想知道java进程是否正在运行?或更具体的东西。 – omainegra
由于它是第三方产品,我无法修改现有的Java应用程序。我想监视它的内存使用情况,线程计数器等,并在百分比超过某个阈值时生成警报。 – user2867834