我有一个解决方案:
如果您的Java 进程在防火墙后面的 Linux 上运行,并且您想在本地计算机上的 Windows 上启动JConsole/Java VisualVM/Java Mission Control ,以将其连接到Java 进程的 JMX 端口。
您需要通过 SSH 登录访问您的 linux 机器。所有通信都将通过 SSH 连接进行隧道传输。
提示:无论是否有防火墙,此解决方案都有效。
缺点:每次重新启动java 进程时,都需要再次执行 4 - 9 的所有步骤。
1. 您需要从这里为您的 Windows 机器安装 putty-suite:
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 进程的 Process-Id
ps -ef | grep <java-processname>
result ---> <process-id>
例子:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5.找到RMIServer stubs下载的任意端口
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 机器上使用 putty 启用两个 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 会话保持打开状态。
登录后,Putty 将通过 SSH 端口 22 将所有 TCP 连接隧道连接到 linux 机器。
JMX-端口:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer 存根端口:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. 使用以下 URL 启动 JConsole / Java VisualVM / Java Mission Control 以连接到您的 Java 进程
这可行,因为 JConsole / Java VisualVM / Java Mission Control 认为您连接到本地 Windows 机器上的端口。但是腻子将所有有效负载发送到端口 15666 到您的 linux 机器。
在 linux 机器上,java 进程首先给出答案并发回 RMIServer 端口。在本例中为 37123。
然后 JConsole / Java VisualVM / Java Mission Control 认为它连接到 localhost:37123 并且 putty 会将整个有效负载转发到 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-]