有时候程序内存溢出或者做压力测试的时候我们就需要监控我们的程序的运行状况,包括内存使用情况、CPU使用情况等等,Java VisualVM就是监控这些数据的一个很好的工具,它在JDK安装目录的bin目录下。
在打开这个工具之前,我们先对我们部署的java项目做一些配置。我这里是使用Docker-Compose对容器进行管理,所以我这里主要就是修改docker-compose.yml文件和docker容器的构建文件Dockerfile。
红框中的那一句就是为了使用Java VisualVM实现监控而多加的一行,这一行的目的是为了把容器内的1199端口挂载到宿主机的1199端口。
红框中的内容就是为了使用Java VisualVM实现监控而多加的内容。其中
-Djava.rmi.server.hostname指定宿主机的公网ip
-Dcom.sun.management.jmxremote.port用于Java VisualVM远程监控的端口
-Dcom.sun.management.jmxremote.rmi.port指定“用于Java VisualVM远程监控的端口”需要挂载到宿主机的哪个端口
-Dcom.sun.management.jmxremote.authenticate配置是否需要验证,如果true,则在使用Java VisualVM连接的时候需要你认证账号密码
-Dcom.sun.management.jmxremote.ssl不指定ssl
最后开放上面配置的1199端口,如果你的是阿里云服务器,就像我下图一样,在阿里云控制台配置安全组规则。别的云服务器安全策略配置方式可能不一样,有的可能是配置防火墙,反正目的就是向外开放1199端口。
修改好这两个文件之后重新构建你的容器,然后在你本地就可以远程监控你的Java程序了。
最后监控成功,如下图
当我们需要“堆dump”操作的时候,dump文件是生成在远程服务器的docker容器内的,如下两张图,我们需要把dump文件拿到本地来分析的话,需要找到dump文件的位置
所以我们要把容器内的tmp目录挂载在宿主机的tmp目录,这样我们就可以通过宿主机拿到我们的dump文件