jvm监控
在 Java 开发中,经常会遇到程序运行缓慢、内存泄漏等问题,此时 JVM 监控工具就派上用场了。常见的 JVM 监控工具主要有 Jstat、VisualVM 和 Arthas
[TOC]
#.示例 java 版本为 20.0.2
[root@localhost opt]# java -version
openjdk version "20.0.2" 2023-07-18
OpenJDK Runtime Environment (build 20.0.2+9-78)
OpenJDK 64-Bit Server VM (build 20.0.2+9-78, mixed mode, sharing)
#.示例 java 程序为 metabase.jar
[root@localhost opt]# ps -ef | grep java
root 6046 1 5 00:01 pts/0 00:00:32 java -jar /data/metabase_3000/metabase.jar
root 6305 3330 0 00:10 pts/0 00:00:00 grep --color=auto java
Jstat 工具
- Jstat 是 JDK 自带的一个非常实用的监控工具,它可以提供关于垃圾回收、类加载和编译的信息。可以使用 jstat -gcutil $pid 来获取GC的详细信息。
[root@localhost opt]# pid=`ps -ef | grep java | grep "metabase" | awk '{print $2}'`
[root@localhost opt]# jstat -gcutil $pid 1000 5
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
0.00 87.50 25.45 52.46 99.68 99.38 33 0.287 0 0.000 16 0.032 0.319
0.00 87.50 25.45 52.46 99.68 99.38 33 0.287 0 0.000 16 0.032 0.319
0.00 87.50 25.45 52.46 99.68 99.38 33 0.287 0 0.000 16 0.032 0.319
0.00 87.50 25.45 52.46 99.68 99.38 33 0.287 0 0.000 16 0.032 0.319
0.00 87.50 25.45 52.46 99.68 99.38 33 0.287 0 0.000 16 0.032 0.319
VisualVM 插件
VisualVM 是 Oracle 提供的一款免费、可视化 Java 故障诊断与性能分析工具,可以实时监控Java进程的堆内存结构、变化趋势以及垃圾回收时间的变化趋势。通过这个插件,可以直观地观察到堆内存和GC的变化情况。
- 第1步,在被监控的 Java 应用启动脚本中添加 JMX 参数,开启远程监控选项,示例为 metabase 的启动脚本:
注:示例中的 3000 是 java 服务(metabase)的监听端口,9999 用于 VisualVM 客户端通信,而 192.168.31.211 是运行 java 服务的ip地址
#!/bin/sh
export DMB_JETTY_PORT=3000
export MB_DB_TYPE=mysql
export MB_DB_DBNAME=metabase
export MB_DB_PORT=3306
export MB_DB_USER=user_metabase
export MB_DB_PASS=Admin_147
export MB_DB_HOST=127.0.0.1
nohup java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djava.rmi.server.hostname=192.168.31.211 \
-jar /data/metabase_3000/metabase.jar > /data/metabase_3000/metabase.log 2>&1 &
- 第2步,登录 VisualVM 官网 下载 VisualVM 2.2.1,解压之后运行 .\bin\visualvm.exe
注:这台 windows 服务器必须已配置 JAVA 环境
#.下载地址
http://iso.sqlfans.cn/jdk/wins/visualvm_221.zip
- 第3步,在 VisualVM 中选择 Add Remote Host,输入被监控的 Java 服务器 IP,示例 192.168.31.211
- 第4步,在 VisualVM 中选择 Add JMX Connection,输入被监控的 Java 应用端口,示例 9999
- 第5步,点击 Monitor 查看实施监控
Arthas
- Arthas(阿尔萨斯)是阿里开源的 Java 诊断工具,主打“实时、动态、非侵入式”的线上问题排查。无需修改代码或重启服务,即可实现:
curl -s https://arthas.aliyun.com/arthas-boot.jar -o /opt/arthas-boot.jar
java -jar /opt/arthas-boot.jar
- 方式1:执行 java -jar arthas-boot.jar 会列出所有 Java 进程,输入序号选择进程
[root@localhost opt]# java -jar /opt/arthas-boot.jar
[INFO] JAVA_HOME: /usr/java/jdk-20.0.2
[INFO] arthas-boot version: 4.1.9
[INFO] Process 6046 already using port 3658
[INFO] Process 6046 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 6046 /data/metabase_3000/metabase.jar
# 输入序号选择进程
1
- 方式2:通过 java -jar arthas-boot.jar
直接选择某个 java 进程,示例连接 metabase 进程
pid=`ps -ef | grep java | grep "metabase" | awk '{print $2}'`
java -jar /opt/arthas-boot.jar $pid
- 方式3:设置允许浏览器连接 arthas,示例连接 metabase 进程
pid=`ps -ef | grep java | grep "metabase" | awk '{print $2}'`
java -jar /opt/arthas-boot.jar $pid --target-ip 0.0.0.0 --username admin --password Admin_147
- 基础命令:
| 命令 | 作用 | 备注 |
|---|---|---|
| version | 查看 Arthas 版本 | - |
| help | 查看帮助文档 | - |
| dashboard | 查看 JVM 实时状态 | 类似 Linux top |
| thread | 查看所有线程 | - |
| thread -n 3 | 查看 CPU 占用最高的 3 个线程 | - |
| thread $id | 查看特定线程的堆栈 | - |
| thread -b | 查看死锁 | - |
| thread -state WAITING | 查看处于 WAITING 状态的线程 | - |
| sc *UserService | 模糊搜索类 | 示例 sc metabase.util.secret.Secret* |
| vmoption | 查看所有 JVM 参数 | - |
| vmoption PrintGC | 查看特定 JVM 参数 | - |
| vmoption PrintGC true | 修改参数 JVM 参数 | - |
| quit / stop | 退出当前 Arthas 客户端 | - |
- 常用命令:watch
# 统计方法执行情况
monitor -c 5 com.example.UserService getUserInfo
# 每 5 秒输出一次统计:
# timestamp class method total success fail avg-rt(ms) fail-rate
# 2026-05-18 18:05:15 UserService getUserInfo 120 118 2 45.6 1.67%
# 参数说明:
# -c 5: 每 5 秒统计一次
# total: 总调用次数
# success: 成功次数
# fail: 失败次数
# avg-rt: 平均响应时间
# fail-rate: 失败率



