一、问题产生背景
线上突然产生高并发且大报文交易,应用采用log4j2打印了大报文日志,引起了内存泄露。
二、排查
分析heapdump文件,发现主要被log4j2的RingBuffer占用。
linux命令:jmap -histo:live 32090 > 32090.txt
三、原因
log4j2为提高吞吐速率采用循环队列缓存将要打印的日志,随后采用异步线程“消费”队列内容。
当高并发大量日志打印的过程中,会导致内存占用过高。
四、处理
在启动脚本中配置启动参数:-DAsyncLoggerConfig.RingBufferSize=4096 (该参数默认是256k,指循环队列缓存块个数)
参考链接:
https://blog.csdn.net/u013807856/article/details/115374850?spm=1001.2014.3001.5506