如何使用JVM监控Mycat

Mycat 本身就是一个 Java 进程,所以所有标准 JVM 监控工具都能直接用。

一、先找到 Mycat 进程

bash
运行
jps -l
你会看到类似:
plaintext
12345 io.mycat.MycatServer
记住这个 PID,后面所有工具都要用。

二、最常用:jstat 看 GC、内存、CPU(生产必备)

1. 看 GC 情况(最重要)

bash
运行
jstat -gcutil <pid> 1000 10
含义:每 1 秒输出一次,共 10 次。
重点看这几列:
  • S0、S1、E、O:幸存区、伊甸区、老年代使用率
  • YGC、YGCT:Young GC 次数、总耗时
  • FGC、FGCT:Full GC 次数、总耗时(越少越好)
  • GCT:GC 总耗时占比
生产告警线
  • FGC 频繁 > 1 次 / 1440 分钟(一天)就有问题
  • FGCT 飙升、CPU 高 → 大概率内存泄漏或堆太小

2. 看类加载、线程

bash
运行
jstat -class <pid>
jstat -threads <pid>

三、看堆内存详情:jmap

1. 查看堆概况

bash
运行
jmap -heap <pid>
能看到:
  • 堆最大、最小、已用
  • 新生代 / 老年代比例
  • Eden:S0:S1 比例

2. 查看对象占用(排查内存暴涨)

bash
运行
jmap -histo:live <pid> | head -20
看哪些类实例最多、占内存最大,快速定位内存泄漏。

3. 导出堆 dump(排查 OOM 必备)

bash
运行
jmap -dump:format=b,file=mycat.hprof <pid>
MAT(Eclipse Memory Analyzer) 打开分析泄漏。

四、实时看线程、死锁、堆栈:jstack

1. 导出所有线程栈

bash
运行
jstack <pid> > stack.log

2. 排查死锁

bash
运行
jstack -l <pid>
搜索关键字:
  • deadlock
  • BLOCKED
  • WAITING
Mycat 常见阻塞点:
  • 后端 MySQL 连接池满
  • 网络 IO 阻塞
  • 锁竞争

五、图形化监控(简单直观)

1. jconsole(JDK 自带)

bash
运行
jconsole
连接本地 Mycat 进程即可看到:
  • 堆内存
  • 线程
  • CPU
  • MBean

2. jvisualvm(更强,推荐)

bash
运行
jvisualvm
功能:
  • 实时堆图
  • 抽样 CPU
  • 内存抽样
  • 线程死锁检测
  • 打开 hprof 文件

六、远程 JVM 监控(生产常用)

如果你要远程监控服务器上的 Mycat,需要在 Mycat 启动参数里加 JMX 配置。
修改 wrapper.confmycat 启动脚本,添加:
plaintext
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=10003
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=服务器IP
重启 Mycat 后,本地 jvisualvm 输入:
plaintext
服务器IP:10003
就能远程监控。

七、Mycat 专用 JVM 最佳配置(直接抄)

Mycat 是高 IO 型,推荐堆不要太大,避免 FullGC。
plaintext
-Xms4G
-Xmx4G
-Xmn2G
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/usr/local/mycat/logs/gc.log

八、你实际要监控哪些指标?(精简版)

  1. 堆内存使用率(是否持续上涨 → 内存泄漏)
  2. FullGC 次数与耗时(核心)
  3. 线程数是否暴涨
  4. 是否死锁
  5. 连接池线程是否阻塞在 MySQL
上一篇 iRadio概述技术白皮书-6W100
下一篇 设备的热耗(散热量)如何计算