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 非常实用。

常见用法:

  • dashboard
  • thread
  • heapdump
  • monitor

对于 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 后端压测分析的第一步。