本文目录导读:

- 接口性能与响应时间(最直观的体验指标)
- 线程池与容器指标(Java特有瓶颈)
- JVM 与内存管理(保障稳定性的基石)
- 数据库与外部依赖(Java应用的主要瓶颈)
- 业务成功率与异常(必须结合业务看)
- 总结:如何选择“最值得”的指标?
针对“Java案例”最值得重点关注的指标,取决于你当前的角色(业务方、开发者、运维/SRE)以及案例所处的阶段(代码质量、接口性能、系统稳定性)。
综合国内互联网大厂(阿里、美团等)的实践和Java生态的通用标准,以下 5大核心维度 及其具体指标是所有Java案例中最值得优先关注的:
接口性能与响应时间(最直观的体验指标)
这是业务方和用户最关心的,也是最容易出问题的环节。
- TP99 / TP999(核心): 相比平均值(Avg),TP99(即99%的请求在多少毫秒内完成)更能反映系统的真实拥挤情况,如果一个接口的平均值是50ms,但TP99是500ms,说明存在严重的长尾延迟(可能是GC停顿或数据库抖动)。
- Apdex(应用性能指数): 这是业界标准的用户满意度指标,通常以0.5秒为满意阈值,1秒为可容忍阈值,Apdex值低于0.9通常意味着用户体验开始下降。
- QPS / TPS(吞吐量): 必须要结合响应时间一起看,评估在特定并发下的极限吞吐,以及达到极限吞吐时响应时间是否急剧恶化(拐点)。
线程池与容器指标(Java特有瓶颈)
这是Java案例中最容易踩坑的地方,直接反映资源利用是否合理。
- 活跃线程数(Active Threads)与 队列积压(Queue Size): 如果Tomcat或业务自定义线程池(如ThreadPoolExecutor)的队列持续积压,且活跃线程数打满,通常意味着线程阻塞(可能锁竞争、数据库慢SQL、外部依赖慢),这是排查系统假死、CPU飙高的关键入口。
- 直接内存(Direct Buffer)与 Metaspace: 这是Java特有的内存。Direct Buffer泄漏常导致
OutOfMemoryError: Direct buffer memory;Metaspace 增长过快通常是类加载器泄漏(常见于动态代理、热部署场景)。
JVM 与内存管理(保障稳定性的基石)
重点看GC(垃圾回收),而不是单纯看堆内存大小。
- Full GC 频率与耗时(最核心): 这是Java应用最致命的风险点,Full GC频率过高(如每分钟>1次)或单次耗时过长(>1秒),会直接导致应用卡顿(Stop-The-World)。
- GC 吞吐量: 即应用运行时间占总时间的百分比,低于99%通常意味着GC对系统性能产生了明显干扰。
- 堆内存增长趋势(Young 和 Old 区): Old Generation(老年代) 持续增长且无法回落,说明存在内存泄漏趋势(典型原因是集合类局部变量未释放、Static缓存、ThreadLocal未清理)。
数据库与外部依赖(Java应用的主要瓶颈)
大多数Java应用性能瓶颈在数据库和网络IO,而非CPU计算。
- 慢SQL(执行时间 > 100ms): 这是Java案例中排查性能问题最常发现的根因,重点关注扫描行数(Rows Examined)与返回行数(Rows Sent)的比值,比值越大说明索引利用率越差。
- 连接池等待时间(常见如 Druid、HikariCP): 如果获取数据库连接的等待时间持续上升,说明连接池不够用或数据库连接未释放(泄漏),这是导致接口超时的常见原因。
- 外部RPC/HTTP调用耗时: 重点关注第三方接口的 TP99 耗时,以及 熔断、降级、重试 的次数,如果外部依赖抖动,会直接拖垮Java应用自身。
业务成功率与异常(必须结合业务看)
监控中“系统正常”不代表业务正确。
- 接口错误率(HTTP 5xx / 业务码错误): 重点关注 “业务异常”(如空指针、参数校验失败)和 “资源异常”(如超时、连接拒绝)的占比,这对区分是代码Bug还是依赖故障至关重要。
- 重试次数与幂等性命中率: 在分布式场景下,重试能提升容错,但也会放大流量,重点监控由于重试导致的重复请求比例,以及是否有数据幂等性校验失败。
如何选择“最值得”的指标?
如果你是新手或做日常巡检,建议先盯住以下 5个“黄金”指标,覆盖了从用户到代码的闭环:
- 接口 TP99(延迟)
- Full GC 暂停时间(稳定性)
- 数据库慢SQL数量(根因)
- 线程池活跃线程数 / 队列深度(资源状态)
- 接口成功率 / 业务异常率(业务健康)
特别提醒: 在Java案例(特别是高并发案例)中,避免只看CPU使用率,很多时候CPU消耗在GC上(GC线程占CPU),或者CPU在“空转”(大量无意义的自旋锁),这两者对业务都是无效消耗,CPU高不高不是重点,“有效业务线程”处理请求的耗时才是重点。
记住一个核心思维:指标是用来定位问题的,不是用来报喜的,看到某个指标异常,要能顺藤摸瓜找到对应的 线程堆栈(Thread Dump) 或 GC日志(GC Log) 来做最终确认。