利用性能测试排查服务线上内存占用过高的问题续篇

问题:服务器内存占用率居高不下
线索:ImportCheckFailedEntity存活的实例数高(导入文件用到),TreeMap、ReentrantLock存活的实例数高(excel导入组件用到)
原因:
1、线程池线程中ThreadLocal存放的数据内存泄露。由于线程池中线程的生命很长,在线程池的线程中使用ThreadLocal必需要调用其clear方法清空TreadLocal中的数据释放内存;
2、Excel导入组件中的OPCPackage用完需调用close方法释放读写锁锁定的数据
涉及范围:
1、使用poi导入excel文件的功能(包括实时的或者异步的)
2、使用了TreadLocal的导入文件的功能(批处理异步导入的都用了)
修复后压测效果:对导入接口压测10分钟后,抓取堆内存信息分析,无excel数据对象信息。压测过程中内存增幅极小、增涨趋势平滑缓慢(说明能被ygc回收)
我挑了一个导入功能做测试,其它导入功能优化方法相同。

jstate -gcutil pid 1000 100 #jstat抓取gc信息,每隔1秒打印一次,打印100次
jstack pid jstack #抓取进程线程信息
jmap -heap pid #查看堆内存分配信息

猜你喜欢

转载自blog.csdn.net/feifeixiongxiong/article/details/110123321