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: 失败率
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-05-18 20:51:43

results matching ""

    No results matching ""