用 JVM 自带命令行工具监控 Mycat

Mycat 是 Java 进程,JDK 自带 5 个核心命令行工具就能全覆盖监控:jps、jstat、jmap、jstack、jhat,不用装任何额外软件,纯命令行就能排查 CPU 高、内存泄漏、频繁 GC、线程卡死、死锁。

一、第一步:找到 Mycat 进程 PID

1. 查所有 Java 进程

bash
运行
jps -l
输出示例:
plaintext
23456 io.mycat.MycatServer
记下 PID:23456,下面所有命令都用这个 PID。

2. 过滤只看 Mycat

bash
运行
jps -l | grep MycatServer

二、jstat:实时监控 GC、内存、线程(最常用)

1. 监控 GC 垃圾回收(重点必看)

bash
运行
jstat -gcutil 23456 1000
  • 1000:每 1 秒刷新一次

    字段含义:

  • S0/S1/E/O:新生代、老年代内存使用率
  • YGC/YGCT:年轻 GC 次数、累计耗时
  • FGC/FGCTFull GC 次数、累计耗时
  • GCT:总 GC 耗时
判断标准
  • FGC 持续上涨 → 内存泄漏 / 堆太小
  • FGCT 很高 → 接口卡顿、Mycat 响应慢
  • O 老年代占用一直 90%+ → 必调优

2. 查看内存容量与分配

bash
运行
jstat -gc 23456 1000

3. 查看线程数量

bash
运行
jstat -thread 23456

三、jmap:监控堆内存、对象占用、导出堆快照

1. 查看 Mycat 堆内存整体配置

bash
运行
jmap -heap 23456
能看到:
  • Xms/Xmx 堆大小
  • 新生代 / 老年代分配
  • 使用的垃圾收集器 G1/Parallel

2. 查看哪些对象占用内存最多

bash
运行
jmap -histo:live 23456 | head -30
  • 看实例数、占用内存大小
  • 发现某类对象无限增长 → 内存泄漏

3. 导出堆 Dump 文件(OOM、内存暴涨必用)

bash
运行
jmap -dump:format=b,file=mycat_heap.hprof 23456
导出后可用 MAT、VisualVM 打开分析泄漏根源。

四、jstack:监控线程、卡死、死锁

1. 导出全部线程堆栈

bash
运行
jstack 23456 > mycat_thread.log

2. 检测线程死锁

bash
运行
jstack -l 23456
搜索关键字:
  • Found one Java-level deadlock 出现就是死锁
  • BLOCKED 大量阻塞线程
  • WAITING 大量等待线程 → 连接池耗尽、SQL 阻塞

3. 配合 top 查最耗 CPU 线程

  1. 看 Mycat 整体 CPU
bash
运行
top -p 23456
  1. 看内部哪个线程 CPU 最高
bash
运行
top -H -p 23456
拿到线程 ID 后,转十六进制,去 jstack 日志里搜,定位代码阻塞点。

五、jcmd:全能合集工具(替代上面所有)

一条命令看 GC、线程、内存、VM 信息:
bash
运行
# 列出所有可执行命令
jcmd 23456 help

# 打印线程堆栈
jcmd 23456 Thread.print

# 查看 GC 状态
jcmd 23456 GC.info

# 生成堆快照
jcmd 23456 GC.heap_dump mycat_dump.hprof

六、Mycat 常见故障 JVM 排查套路

  1. Mycat 响应慢、卡顿
    • jstat -gcutil 看是否频繁 FullGC
  2. CPU 占用飙高
    • top -H -p PID + jstack 定位高 CPU 线程
  3. 内存持续涨、不释放
    • jmap -histo 看对象增长,导出 hprof 分析
  4. 连接卡死、假死
    • jstack 查 BLOCKED、死锁、线程池耗尽

七、日常运维推荐常备命令

把 PID 换成你实际的即可:
bash
运行
# 实时看GC
jstat -gcutil 23456 1000

# 看堆配置
jmap -heap 23456

# 查线程死锁
jstack -l 23456
上一篇 DLDP检测互联网地址DOWN
下一篇 laravel-mongodb数据备份策略:自动化快照与恢复流程