lmax RingBuffer 和 log4j 占用大量内存

Posted

技术标签:

【中文标题】lmax RingBuffer 和 log4j 占用大量内存【英文标题】:lmax RingBuffer with log4j takes up a lot of memory 【发布时间】:2020-05-25 17:24:50 【问题描述】:

我正在调试模式下运行 Tomcat Web 应用程序,并使用 YourKit 分析器查看最大的对象,我发现迄今为止最大的对象是 com.lmax.disruptor.RingBuffer 的单个实例。我认为这与 log4j 有关系,它在内部使用RingBuffer 来异步报告。有什么办法可以减少这个对象的内存占用?为什么这么大?

【问题讨论】:

它有多大? Tomcat 版本是多少? 42M,在带有 Java 8 的 Tomcat 9 上运行。 42M真的有问题吗? 没问题,但我很好奇。 【参考方案1】:

来自Async Log4j2, memory leak?:

Apache Log4j2 在异步模式下的实现使用了一个 RingBuffer 来 缓冲所有日志内容。默认使用 262144 个插槽(256 * 1024)。这会导致大约 40 的初始内存保留 兆字节,并且在内存有限的环境中会导致内存 头总是满的,因此开始减速。

要减少内存使用,请通过设置系统属性来减少 RingBuffer 的大小(槽数):

log4j2.asyncLoggerRingBufferSize=value

最小大小为 128。要分配 5Mb,请将值设置为 32768。有关详细信息,请参阅Log4j Async Loggers。

【讨论】:

以上是关于lmax RingBuffer 和 log4j 占用大量内存的主要内容,如果未能解决你的问题,请参考以下文章

监控 LMAX Disruptor

(转) Ringbuffer为什么这么快?

SpringCloud升级之路2020.0.x版-11.Log4j2 监控相关

获取环形缓冲区中的当前消息数

SpringCloud升级之路2020.0.x版-11.Log4j2 监控相关

Log4j2 - java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor