Tomcat 6引发的定时Full GC问题

最近分析系统经常性的报出一些可用率报警问题,跟进一个案例,报警是 API 超时,JSF(JD 自研的 RPC 框架) 提供者性能没有问题,JSF 调用者超时,分析 Full GC 造成的。

登录堡垒机,通过 jstat -gccause 命令打印 GC 原因,发现是 System.gc 导致:

查看 JVM 监控,发现个有规律的现象, Full GC 频率是1个小时。

考虑到老系统使用的是 Tomcat6,初步怀疑是 Tomcat6(之前看到过大神文章,出现过类似问题,链接:https://liuxi.name/blog/20160608/jvm-full-gc-hourly.html) 为了防止内存泄露,周期性的触发 System.gc(),下面是 server.xml 中监听器的配置。

下面是 Tomcat 6.0.33 版本中,JreMemoryLeakPreventionListener 触发 FULL GC 的实现:

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。