如何监控Java 8 Spring服务GC并通过Prometheus在Grafana展示
Spring Boot Java 8 应用GC异常监控核心指标
以下是你搭建Grafana监控大盘、配置健康红绿灯需要重点关注的指标,全部可以通过Spring Boot Actuator暴露的Micrometer指标直接获取:
核心GC运行指标
- Minor GC(新生代GC)
- 单位时间触发次数:对应指标
jvm.gc.pause,筛选action="minor"标签,统计1分钟内的触发量,正常区间为<5次/分钟,超过10次/分钟属于异常 - 暂停耗时百分位:取
jvm.gc.pause的p95、p99值,正常应该低于100ms,超过500ms属于严重异常
- 单位时间触发次数:对应指标
- Full GC(老年代GC)
- 单位时间触发次数:对应指标
jvm.gc.pause,筛选action="major"标签,统计1小时内的触发量,正常区间为0次/小时,超过2次/小时属于严重异常 - 暂停耗时百分位:取p95、p99值,Java 8默认Parallel GC场景下正常低于1s,CMS场景下正常低于2s,超过阈值直接判定异常
- 单位时间触发次数:对应指标
- GC耗时占比:统计1分钟内所有GC暂停的总耗时,占总运行时间的比例,<1%为正常,1%~3%为警告,>3%为严重异常
辅助根因定位的内存池指标
通过内存占用趋势可以提前预判GC风险、定位异常原因:
- 新生代内存:对应指标
jvm.memory.used,分别筛选id="Eden Space"、id="Survivor Space"标签- Eden区未满就频繁触发Minor GC,说明存在内存分配异常
- Survivor区占用率长期超过50%不降,说明大量短生命周期对象被提前晋升到老年代,会增加Full GC风险
- 老年代内存:对应指标
jvm.memory.used,筛选id="Tenured Gen"标签- 每次Full GC完成后,老年代剩余占用量持续上涨,说明存在内存泄漏
- 老年代占用率<70%为正常,70%~85%为警告,>85%为严重异常,大概率会很快触发Full GC
健康红绿灯判定规则
你可以直接基于上述指标阈值配置三色状态:
- 绿灯(正常):满足所有条件:1分钟内Minor GC次数<5、p99耗时<100ms;1小时内无Full GC;老年代占用率<70%;GC耗时占比<1%
- 黄灯(警告):满足任一条件:1分钟内Minor GC次数510、p99耗时100500ms;1小时内Full GC次数12次;老年代占用率70%85%;GC耗时占比1%~3%
- 红灯(异常):满足任一条件:1分钟内Minor GC次数>10、p99耗时>500ms;1小时内Full GC次数>2次;老年代占用率>85%;GC耗时占比>3%
内容的提问来源于stack exchange,提问作者Robbie
相关产品推荐
相关产品推荐

