本文目录导读:

- 第一优先级:JVM 内存与 GC(垃圾回收)指标
- 第二优先级:线程与并发指标
- 第三优先级:线程池与连接池指标(中间件层面)
- 第四优先级:I/O 与 CPU 指标(资源层)
- 第五优先级:应用业务层面的“黑盒”指标(对用户体验最直接)
- 最重要的两个“元指标”逻辑:
- 总结:如果你只能盯3个仪表盘,建议是:
在Java开发中,“最值得重点关注”的指标取决于你当前所处的阶段(是代码评审、性能调优,还是线上稳定性排查)和业务场景(是Web服务、大数据处理还是微服务)。
如果一定要从投入产出比和对系统健康度的影响来排序,我认为以下 5个方向(共15个具体指标) 最值得重点关注:
第一优先级:JVM 内存与 GC(垃圾回收)指标
为什么最值得关注? 因为JVM内存泄漏和GC停顿是导致Java应用卡顿、CPU飙升、OOM(内存溢出)的第一大元凶。
- Heap 使用率(堆内存):
- 关注点:堆使用率是否呈周期性锯齿状(正常)还是持续爬升(内存泄漏信号)。
- 重点:当老年代(Old Gen)使用率持续高于70%-80%时,极易引发Full GC。
- GC 暂停时间(Pause Time):
- 关注点:单次GC停顿时长(特别是Full GC),对于响应式服务,单次STW(Stop-The-World)停顿超过100ms就该警惕。
- 重点:关注GC频率和耗时,而不是仅仅关注GC次数。
- GC 吞吐量(Throughput):
- 关注点:应用运行时间占(运行时间+GC时间)的百分比,低于95%说明GC开销过大。
- 关键进阶指标:Allocation Rate(分配速率) 和 Promotion Rate(晋升速率),这两个指标能帮你快速定位是“内存生得快”还是“死得慢”。
第二优先级:线程与并发指标
为什么最值得关注? Java是线程模型,线程阻塞或耗尽会导致整个服务假死,且极难排查。
- 线程池活跃度(Active Threads / Running Threads):
- 关注点:核心线程池是否被打满?活跃线程数是否长期接近最大线程数?
- 重点:如果活跃线程数达到上限,即使CPU空闲,请求也会开始排队,导致接口RT(响应时间)飙升。
- Blocking 线程数(阻塞线程数):
- 关注点:处于
WAITING或TIMED_WAITING状态的线程占比,如果大量线程阻塞,通常意味着锁竞争严重(如数据库连接池耗尽、Redis连接池耗尽)。
- 关注点:处于
- 线程创建速率(Thread Creation Rate):
- 关注点:单位时间内新建的线程数,过高通常意味着代码在无脑创建线程,或者线程池参数配置不合理。
第三优先级:线程池与连接池指标(中间件层面)
为什么最值得关注? Java应用95%以上的性能瓶颈在“池”(数据库连接池、HTTP线程池、MQ消费线程池)的耗尽。
- Tomcat / Jetty 活跃线程数:
- 关注点:Web容器的最大线程数剩余量(
maxThreads与activeCount),如果活跃线程数达到最大值且队列持续增长,说明应用吞吐量已达上限。
- 关注点:Web容器的最大线程数剩余量(
- 数据库连接池使用率(如 HikariCP 的
activeCount/maxPoolSize):- 关注点:连接获取等待时间(acquire-timeout),如果大量的请求卡在获取数据库连接上,这通常比SQL慢查询更致命——因为它会霸占Tomcat的线程。
- HTTP 客户端连接池(如 OkHttp / RestTemplate):
- 关注点:
poolSize和pendingRequests,微服务间的调用如果出现连接池ConnectionPoolTimeoutException,往往根因在下游服务。
- 关注点:
第四优先级:I/O 与 CPU 指标(资源层)
为什么最值得关注? 这些指标能帮你区分是“计算密集”还是“等待密集”,指导优化方向。
- CPU 使用率(User / Sys / I/O Wait):
- 重点关注:
iowait(等待I/O时间)。iowait很高,说明应用在等待磁盘(如日志写入、Redis持久化)或网络,改用异步写入通常能极大提升性能,同时关注Sys(系统调用)占比,过高可能意味着频繁的线程切换或锁竞争。
- 重点关注:
- 文件描述符(FD)打开数:
- 关注点:
/proc/{pid}/fd数量是否线性增长,FD泄漏是Java长驻进程常犯的错误(忘记关闭InputStream/Socket),最终会导致Can't open file异常。
- 关注点:
第五优先级:应用业务层面的“黑盒”指标(对用户体验最直接)
为什么最值得关注? 这是唯一能直接对应到用户体验的指标,也最能触发报警。
- P99 / P95 响应时间(RT):
- 重点关注:“平均响应时间(Avg)”是极度具有误导性的指标,因为长尾请求会拖垮平均值,关注 P99(99%的请求在多少毫秒内完成),P99 漂移严重,说明有慢SQL、锁竞争或垃圾回收抖动。
- 错误率与异常计数(Exception Rate):
- 关注点:HTTP 5xx 错误率、特定业务异常(如数据库死锁异常、NullPointerException)的每分钟发生次数。重点:对
OutOfMemoryError和StackOverflowError设置高风险告警。
- 关注点:HTTP 5xx 错误率、特定业务异常(如数据库死锁异常、NullPointerException)的每分钟发生次数。重点:对
最重要的两个“元指标”逻辑:
在关注单个指标时,建议把这几个指标串联起来看,不要孤立分析:
- 黄金组合:
P99 RT+GC暂停时间+活跃线程数,当RT飙升时,来看GC是否停顿,线程是否被阻塞。 - 最直接的“灭火”指标:
Full GC 频率和连接池 waiting_time,这两个指标一旦异常,速度极快,能让服务在几秒内不可用。
如果你只能盯3个仪表盘,建议是:
- JVM Dashboard:看
Heap和Full GC Time。 - 线程池 Dashboard:看
Tomcat Active Threads和DB Connection Pool Active。 - 业务延时 Dashboard:看
P99 RT和错误率。
这15个指标覆盖了Java应用从“内存—线程—外部资源—用户体验”的完整链路,关注它们,基本能解决90%以上的线上疑难杂症。