VisualVM是一个好工具,可以用于查看JVM的运行状态,开发过程中经常用到。
VisualVM需要使用jstatd来连接远程的JVM,jstatd提供了一个-p
的参数,可以指定一个端口,但实际上除了这个端口以外,jstatd还会随机开启一个端口,这个端口是不固定的,这样就导致了VisualVM无法连接到容器内的JVM。
本项目的目的就是解决这个问题,使用javaagent
的方式来启动jstatd,在启动过程中修改jstatd的源码,使其不再随机开启端口,而是使用指定的端口。
- 将
jstatd-agent.jar
放到容器内 - 启动jsatd,假设使用的端口是1099和1100,一个通过
-p
参数指定,一个通过remoteHostPort
指定
jstatd -J-Djava.security.policy=jstatd.all.policy -J-javaagent:jstatd-agent.jar=remoteHostPort=1100 -J-Djava.rmi.server.hostname=x.x.x.x -p 1099
x.x.x.x指服务器IP
remoteHostPort
是必填参数jstatd.all.policy
文件是jstatd的安全策略文件,需要加上remoteHostPort
指定得端口在映射的时候需要保证src和dest端口一致,但是-p
指定的端口不需要一致. 如上述脚本中的-p 1099
和remoteHostPort=1100
,在映射的时候需要保证1100:1100
,但是1099
不需要