TIPS
本文基于JDK 11编写,理论支持JDK 7及更高版本
jstatd & JMX存在的问题:

  • jstatd虽然连接相对方便,但是没有考虑过网络安全相关的问题(对于公网环境,直接开放端口可能存在安全风险)
  • JMX虽然可以开启用户认证以及ssl,但是要做一堆的配置

使用本文的玩法,可以让jstatd更安全;让JMX的安全不那么麻烦。
使用SSH连接到JMX或jstatd的本质,是利用SSH实现了一个SOCKS代理,添加代理后,请求过程:本地 -> 连接SSH代理 -> 转发到你想请求的地址。而SSH是安全的,所以这种方式也比较安全。
一、启动远程应用
远程服务器执行:

  1. java -Djava.rmi.server.hostname=www.itmuch.com \n -Dcom.sun.management.jmxremote.port=1235 \n -Dcom.sun.management.jmxremote.rmi.port=1250 \n -Dcom.sun.management.jmxremote.ssl=false \n -Dcom.sun.management.jmxremote.authenticate=false \n -jar xxx.jar

注意,这里的hostname写localhost即可。当然,你还可以去开启认证、开启ssl。
二、SSH端口转发
在本机执行如下命令,SSH实现端口转发

  1. ssh -v -D 9696 root@www.itmuch.com

其中:

  • -v:verbose模式,打印详情
  • -D:动态应用程序级端口转发,格式:-D [bind_address:]端口 。将会分配一个Sock并监听本地端口。与此端口建立连接后,该链接将通过安全通道转发,然后使用应用协议确定从远程计算机连接到的位置 。

TIPS

三、配置代理
以VisualVM为例,配置成如下即可:
基于SSH实现远程连接 - 图1
四、连接应用
File - Add JMX Connection,填入类似如图的信息即可:
基于SSH实现远程连接 - 图2
端口需和上面com.sun.management.jmxremote.port=1235指定的端口一致。

参考文档

https://stackoverflow.com/questions/1609961/visualvm-over-ssh
http://www.nexusy.com/2014/02/20/ssh-jvisualvm/
https://dzone.com/articles/visualvm-monitoring-remote-jvm
http://issamben.com/how-to-monitor-remote-jvm-over-ssh/
https://segmentfault.com/a/1190000016661877?spm=a2c4e.10696291.0.0.503b19a4VLYYv7