JVM性能分析
返回JVM性能分析
一、为什么压测时一定要看 JVM
Java 应用的性能问题,很多都不只是业务代码问题,而是 JVM 行为问题。
例如:
- GC 频繁
- 堆内存不足
- 线程数异常
- 死锁或阻塞
如果你只看接口 RT,不看 JVM,就很难找到根因。
二、压测中常见的 JVM 问题
Java 压测里最常见的问题包括:
- Young GC 太频繁
- Full GC 出现
- Old 区不断升高
- 线程池打满
- 大量线程阻塞
这些问题通常会直接导致:
- RT 抖动
- QPS 上不去
- 服务超时
三、先看 GC 指标
GC 是最基础的 JVM 观察点。
你需要重点关注:
- GC 次数
- GC 总耗时
- Full GC 是否出现
- 每次 GC 停顿时间
一般判断思路
- Young GC 偶尔发生:正常
- Young GC 非常频繁:对象创建可能太多
- Full GC 持续出现:风险很大
四、jstat:快速看 GC
最常用工具之一是:
jstat -gc <pid> 1000
它可以帮助你看到:
- Eden / Survivor / Old 区使用情况
- GC 次数
- GC 时间
看什么最实用
- Old 区是否持续增长
- Full GC 是否增加
- GC 时间是否明显上升
五、jmap:看堆内存
如果你怀疑:
- 内存泄漏
- 某类对象过多
- 堆内存不合理
可以使用:
jmap -histo <pid>
它会列出对象数量和内存占用。
这对定位:
- 哪种对象创建太多
- 哪种缓存占用太大
非常有帮助。
六、jstack:看线程问题
线程问题在压测里非常常见。
例如:
- 线程池满了
- 大量线程 BLOCKED
- 锁竞争严重
这时可以用:
jstack <pid>
重点看:
- 线程状态
- 是否存在大量 WAITING / BLOCKED
- 是否有死锁
七、Arthas:更适合线上式排查
如果你想更灵活地看 Java 进程,Arthas 非常实用。
常见用法:
dashboardthreadheapdumpmonitor
对于 Java 后端团队来说,Arthas 比单纯的 JDK 工具更适合日常诊断。
八、一个典型案例
假设压测时观察到:
QPS 上不去
RT 周期性抖动
查看 jstat 发现:
Young GC 非常频繁
再看代码发现:
每次请求都创建大量临时对象
那么就可以判断:
- 问题不是数据库
- 主要是对象创建过多,导致 GC 压力大
九、JVM 分析时不要只盯着堆大小
很多人一看到性能问题就想:
把堆调大
这不是不能做,但不能只靠这个。
因为问题可能真正来自:
- 线程阻塞
- 锁竞争
- 连接池等待
- 慢 SQL
JVM 调优不是“堆越大越好”,而是要先知道瓶颈到底在哪里。
十、Java 后端压测的推荐观察项
压测过程中,建议固定观察这些 JVM 指标:
- Heap 使用率
- Old 区变化
- GC 次数与耗时
- Full GC 次数
- 活跃线程数
- BLOCKED 线程数
这些指标结合接口 RT,一般就能看出大方向。
十一、总结
JVM 性能分析的核心,是把压测中的现象和 JVM 指标对应起来。
你不用一开始就做很复杂的调优。
先能回答这几个问题就已经很有价值:
- GC 有没有问题
- 内存有没有问题
- 线程有没有问题
这就是 Java 后端压测分析的第一步。