我在某个远程服务器上运行了一个java进程(在java 7上),我希望使用Java Mission Control进行监视。但是,JMC无法连接,虽然我可以使用端口jmx远程端口telnet到服务器(这里是12345,见下文)。
远程java进程以
启动-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=12345
-Djava.rmi.server.hostname=<some ip address>
-Dcom.sun.management.jmxremote.authenticate=false
这些对我来说似乎是正确的价值观。端口12345已在防火墙上打开,但我怀疑rmi服务器端口被防火墙阻止。
因此,我的问题是:有没有办法(在服务器上使用netstat,甚至可能从客户端使用telnet)来确定java进程当前在服务器上使用哪个rmi服务器端口? (使用netstat,我看到java进程正在使用几个端口。但是,我不知道哪一个是rmi端口。)
答案 0 :(得分:0)
这可能会在超时后显示JMX远程客户端被连接到的地方(加上一些内部信息):
//nopackage -- move if you like
import java.rmi.Remote;
import java.rmi.registry.*;
import java.rmi.server.*;
import sun.rmi.server.UnicastRef;
import sun.rmi.transport.LiveRef;
public class JMXTarget {
/*
* run: java JMXTarget host port
* where host (name or address) contains the JVM process offering JMX
* and port (number) is the registry specified by -Dcom.sun.management.jmxremote.port
*/
public static void main(String[] args) throws Exception {
Registry reg = LocateRegistry.getRegistry (args[0], Integer.parseInt(args[1]));
Remote r = reg.lookup ("jmxrmi");
RemoteObject ro = (RemoteObject)r;
RemoteRef rr = ro.getRef();
UnicastRef ur = (UnicastRef)rr;
LiveRef lr = ur.getLiveRef();
System.out.println (lr);
}
}
请注意,如果指定了sysprop java.rmi.server.hostname
,则其值(您的&#34;某些IP地址&#34;)是客户端连接的位置。如果该值不是目标计算机的地址,或者是解析(对于客户端)到目标计算机的地址的名称,则它不会连接。如果您没有指定它,则默认为(编辑)由InetAddress.getLocalHost()
确定的值,该值至少应该是该计算机的有效地址。
答案 1 :(得分:0)
添加'-Dcom.sun.management.jmxremote.rmi.port = 12345'可以提供帮助