JDK17下Netty导致堆内存疯涨原因排查
💡
原文中文,约9000字,阅读约需22分钟。
📝
内容提要
介绍了天网风控灵玑系统在使用JDK17+ZGC垃圾回收器后出现的内存疯涨和无法释放的问题,排查发现是因为消费者EventLoop处理消费时申请直接内存达到最大内存导致的消费阻塞,通过增加与备份数据节点的channel信道连接,采用connectionPool解决了该问题。
🎯
关键要点
- 天网风控灵玑系统基于内存计算,提供高吞吐低延迟的在线计算服务。
- 灵玑系统在高并发情况下,gc导致可用率降低,影响业务需求。
- JDK17引入ZGC垃圾回收器,能将gc暂停时间控制在亚毫秒级别。
- 在数据中心同步过程中,发现服务端内存疯涨且无法释放。
- 初步排查认为是内存泄漏,后发现是netty相关对象占用堆内存。
- 回滚至jdk8测试发现问题消失,怀疑是jdk17与netty兼容性问题。
- 最终定位到netty的EventLoop消费能力不足,导致内存申请阻塞。
- 解决方案是增加与备份数据节点的channel信道连接,采用connectionPool。
- 根本原因是netty在jdk高版本下需要手动添加jvm参数以优化内存申请。
- 反思中发现缺乏水位线判断和异常监听,导致问题定位缓慢。
➡️