1 .发现过程
笔者在一步一步写Raft协议, 在可以跑了一天后,发现Leader节点的内存使用量缓慢上涨, 且手动执行GC后也没达到预期水平线
Leader节点内存情况
在对Java有深入了解的读者其实是可以理解内存使用量的产生
笔者的测试用例是:
启动四个节点,查看一天后的内存攀升, Leader几点多一个同步[条目]的功能,但多产生了几百兆的浮动内存,和几十兆的固定内存
Follower节点内存情况
2. 排查
通过对GC、内存、线程的排查都没发现问题
Dump
在检查内存结构时发现了有个并发Map的占用很大
通过对这个对象的引用分析可以发现, 存储了Key线程Value是true
到这里笔者已经知道了为什么
3. 原因
- 笔者在项目用运用了虚拟线程, 在目前的监控工具并不能很好的监控到虚拟线程, 导致监控的时候未发现异常的线程存在;
- 没有及时释放线程, 一直处于被引用状态导致无法及时释放