Log4j2 中使用了 java 本机内存吗?我发现许多登录本机内存而不是堆



我们有一个通过运行Main函数启动的java应用程序,我们还在springboot中作为webcontainer启动了嵌入式码头。我发现java头达到了最大大小,但是堆使用率很低,java耗尽了操作系统杀死的本机内存

pmap中有许多64MB内存。我转储了一些内存块,发现其中有很多日志。日志时间是多种多样的,即使过去了几天,日志似乎仍在内存中。 对于示例

2019-03-23T05:50:46,851 661258664 [xxxxxx] INFO
2019-03-27T06:00:12,040 1029308155 [xxxxxxxx] INFO .........

我们使用 log4j2 和 slf4j 作为日志工具。日志由名称以"qtp"开头的码头线打印。 我们设定immediateFlush="false"SizeBasedTriggeringPolicy size="10MB"

我不知道为什么日志内容不在堆中。log4j2 在缓存或写入日志时使用 java 本机内存吗?是否有可能 log4j2 内存泄漏?

我怀疑你所看到的是 Log4j 2 一个鲜为人知的功能的副作用:无垃圾日志记录。

从 log4j 2.6 开始,该库非常小心,在稳定状态日志记录期间不分配任何临时对象(在初始化和配置期间会分配一些临时对象)。

其他没有此功能的日志记录库通常会分配许多 LogEvent 对象,以及字符串、char[]数组和byte[]数组。这些通常非常短暂且收集迅速,但大量的伐木将填满年轻一代并有助于晋升。

在 HotSpot JVM 上,即使是次要集合也是具有所有当前 GC 算法的停止世界集合:串行、并行、并发、CMS 和 G1。(这对于雪兰多和ZGC的影响可能会降低,但在撰写本文时,这些收藏家仍处于实验阶段。另请注意,Zing/Azul 有一个无暂停的收集器,但是这项工作尚未贡献给 OpenJDK。

Log4j 2 通过尽可能避免分配和重用内存来回避这种情况。

最新更新