JVM 压测调优:粗讲笔记
是什么。 通过压测找到 JVM 层面的瓶颈,调参数让服务在目标负载下达标。默认参数不一定适合你的负载,没有压测数据就调,是凭感觉。
粗流程。 先定验收目标:吞吐(QPS 是 Queries Per Second,每秒查询数;TPS 是 Transactions Per Second,每秒事务数)、延迟(p99 就是 99% 的请求延迟低于这个值)、错误率、资源上限。再逐步加压找拐点,看延迟和错误率从哪开始恶化。先区分瓶颈:应用本身慢,还是 JVM 层面(GC 停顿、堆不够、线程打满)。
调优点名。 堆大小(Xms/Xmx)、GC 选型(G1、ZGC、Parallel 各自适合的场景)与 GC 目标(比如 MaxGCPauseMillis)、线程池和连接池、Metaspace、预热和 CodeCache。
发压力的工具,点名。 Apache JMeter:老牌,GUI 编脚本,协议多,重,分布式要搭。k6:JavaScript 写脚本,命令行跑,轻,适合放进 CI。Gatling:Scala DSL,单机并发能力强,报告漂亮。wrk 和 hey:极简款,快速摸上限,不适合编复杂场景。
看 JVM 的工具,点名。 GC 日志(-Xlog:gc*):第一手证据,看停顿和回收频率。JFR,Java Flight Recorder:JDK 自带,低开销事件记录,配 JDK Mission Control 看。jps:列出跑着的 Java 进程。jstat:实时看 GC 和堆统计。jinfo:看或者改运行中 JVM 的配置。jmap:堆转储和堆直方图,找内存泄漏。jstack:线程转储,看死锁和卡住的线程。jcmd:万能诊断入口。jconsole 和 VisualVM:图形化入门。jhsdb:拿堆转储离线分析。async-profiler 加火焰图:定位 CPU 和内存热点。Arthas(阿里巴巴):不用重启的线上诊断,dashboard 一屏看线程、堆、GC、运行时信息。
一条规矩。 一次只改一个变量,改完重测。目标是业务指标,不是参数本身。