jdk中自带了很多工具可以用于性能分析,位于jdk的bin目录下,jvisualvm工具可以以图形化的方式更加直观的监控本地以及远程的java进程的内存占用,线程状态等信息。
一、配置tomcat
在tomcat的bin目录下catalina.sh文件开头加上如下配置:
CATALINA_OPTS=”$CATALINA_OPTS \
-Djava.rmi.server.hostname=你的服务器IP地址 \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.rmi.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false”
关键参数说明:
-Dcom.sun.management.jmxremote.authenticate 和 -Dcom.sun.management.jmxremote.ssl:这里设置为 false 是为了简化测
-Djava.rmi.server.hostname:指定服务器的 IP 地址(替换为实际的公网或内网 IP),确保外部客户端可以访问。
-Dcom.sun.management.jmxremote.port:指定 JMX 监听的端口号(如 9999,需与 Tomcat 默认业务端口区分开)。
-Dcom.sun.management.jmxremote.rmi.port:非常重要。JMX 默认会动态分配 RMI 数据传输端口,将其固定为与主端口相同的值,可避免防火墙拦截随机端口导致连接失败的问题2。
二、配置防火墙
配置防火墙开放9999端口:
# 插入一条规则到 INPUT 链,允许 TCP 协议访问 9999 端口
sudo iptables -I INPUT -p tcp --dport 9999 -j ACCEPT
# 保存规则(防止重启服务器后失效)
# CentOS/RHEL:
sudo service iptables save
# Ubuntu/Debian:
sudo netfilter-persistent save
然后service iptables restart重启防火墙服务。
如firewall,使用以下命令
sudo firewall-cmd --zone=public --add-port=9999/tcp --permanent
三、方案 B:也可不修改catalina.sh文件,通过创建 setenv.sh(推荐法,符合官方规范)
根据 catalina.sh 脚本开头的注释提示(Do not set the variables in this script. Instead put them into a script setenv.sh),最佳实践是在 bin 目录下创建一个 setenv.sh 文件。Tomcat 启动时会自动加载它,且不会破坏原脚本。
- 在 Tomcat 的
bin目录下,新建一个文件,命名为setenv.sh。 - 在文件中写入以下内容(请根据你的实际情况修改 IP):
#!/bin/sh
export CATALINA_OPTS="$CATALINA_OPTS \
-Djava.rmi.server.hostname=192.168.184.129 \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.rmi.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.local.only=false"
注意:最后一行参数后面不要加 \,否则会报错。
四、配置jvisualvm
启动tomcat后,在windows本地jdk安装路径bin目录下找到jvisualvm.exe,双击打开后左侧显示如下:
![图片[1]-Java虚拟机使用jvisualvm工具远程监控tomcat内存 JVM远程监控-龙之小站资源屋](https://www.688918.com/wp-content/uploads/2026/06/2020111112013313.png)
在“远程”上右键–>添加远程主机–>填写主机名:
![图片[2]-Java虚拟机使用jvisualvm工具远程监控tomcat内存 JVM远程监控-龙之小站资源屋](https://www.688918.com/wp-content/uploads/2026/06/2020111112013314.png)
点击确定后,远程选项下多了一条刚才添加的主机列表。右键–>添加JMX连接,如下图,填入JMX远程连接端口号9999,并勾选“不要求ssl连接”:
![图片[3]-Java虚拟机使用jvisualvm工具远程监控tomcat内存 JVM远程监控-龙之小站资源屋](https://www.688918.com/wp-content/uploads/2026/06/2020111112013415.png)
点击确定后,左侧多了一条pid为6822的远程连接,6822是远程tomcat的pid:
![图片[4]-Java虚拟机使用jvisualvm工具远程监控tomcat内存 JVM远程监控-龙之小站资源屋](https://www.688918.com/wp-content/uploads/2026/06/2020111112013416.png)
双击该连接,在右侧可以动态查看jvm的概览信息,监控CPU,java堆,元空间,类,线程等数据:
![图片[5]-Java虚拟机使用jvisualvm工具远程监控tomcat内存 JVM远程监控-龙之小站资源屋](https://www.688918.com/wp-content/uploads/2026/06/2020111112013517.png)
五、常见问题
在添加JMX连接的时候,经常会出现如下报错:
![图片[6]-Java虚拟机使用jvisualvm工具远程监控tomcat内存 JVM远程监控-龙之小站资源屋](https://www.688918.com/wp-content/uploads/2026/06/2020111112013518.png)
此时可以从以下几个方向检查:
(1)检查tomcat应用是否启动,或者修改tomcat配置后是否重启tomcat,确保9999端口处于监听状态,查看命令netstat -nl|grep 9999;
(2)检查主机名是否和tomcat中配置的主机名相同,如果不同则按照第二步修改主机名;
(3)检查RMI端口号端口号是否在防火墙进行了配置,如果配置的RMI端口号和JMX端口号不一致,需要在防火墙配置RMI端口号允许访问,如果没有配置,则添加-Dcom.sun.management.jmxremote.rmi.port=9999配置RMI端口号。

















暂无评论内容