我对此有一个解决方案:
如果Java进程在防火墙后面的Linux上运行,并且您想在本地计算机上的Windows上启动JConsole / Java VisualVM / Java Mission Control,以将其连接到Java进程的JMX端口。
您需要通过SSH登录访问Linux计算机。所有通信将通过SSH连接建立隧道。
提示:无论是否有防火墙,此解决方案均有效。
缺点:每次重新启动 Java进程时,都需要再次执行4-9的所有步骤。
1.您需要从以下位置为Windows机器安装腻子套件:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
至少是putty.exe
2.在您的linux机器上定义一个空闲端口:
<jmx-remote-port>
例:
jmx-remote-port = 15666
3.在Linux机器上向Java进程添加参数
这必须完全像这样完成。如果按以下方式进行操作,则它适用于防火墙后的linux计算机(它是引起该-Djava.rmi.server.hostname=localhost
问题的原因)。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
例:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
4.获取您的Java进程的进程ID
ps -ef | grep <java-processname>
result ---> <process-id>
例:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5.查找RMIServer存根下载的任意端口
Java进程在linux机器上打开一个新的TCP端口,RMI Server-Stubs将在此下载。还需要通过SSH隧道提供此端口,以建立与Java虚拟机的连接。
使用netstat -lp
此端口,还可以lsof -i
提示从Java进程打开了哪个端口。
注意:启动Java进程时,此端口始终更改。
netstat -lp | grep <process-id>
tcp 0 0 *:<jmx-remote-port> *:* LISTEN 24321/java
tcp 0 0 *:<rmi-server-port> *:* LISTEN 24321/java
result ---> <rmi-server-port>
例:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6.用腻子在Windows机器上启用两个SSH隧道
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local
[x] Auto
Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local
[x] Auto
例:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7.在启用了此SSH隧道的情况下,使用Putty登录到Linux计算机。
保持腻子打开状态。
登录后,Putty将通过SSH端口22将所有TCP连接通过隧道传输到linux计算机。
JMX端口:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8.启动JConsole / Java VisualVM / Java Mission Control,以使用以下URL连接到Java进程
这可行,因为JConsole / Java VisualVM / Java Mission Control认为您已连接到本地Windows计算机上的端口。但是Putty将所有负载发送到Linux机器的端口15666。
首先在linux机器上,java进程给出答案并发回RMIServer端口。在此示例37123。
然后JConsole / Java VisualVM / Java Mission Control认为它已连接到localhost:37123,而腻子会将整个有效负载发送到linux机器
Java进程回答并且连接已打开。
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
例:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9.享受#8-]