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

FFM*_*Man 5 java slf4j log4j2

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

pmap中有很多64MB的内存。我转储了一些内存块,发现其中有很多日志。日志时间各不相同,即使过去了几天,日志似乎仍在内存中。例如

2019-03-23T05:50:46,851 661258664 [xxxxxx] INFO
2019-03-27T06:00:12,040 1029308155 [xxxxxxxx] INFO .........
Run Code Online (Sandbox Code Playgroud)

我们使用 log4j2 和 slf4j 作为日志工具。日志由 jetty 线程打印,名称以“qtp”开头。我们设置 immediateFlush="false"SizeBasedTriggeringPolicy size="10MB"

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

Rem*_*pma 4

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

\n\n

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

\n\n

其他不具备此功能的日志库通常会分配许多 LogEvent 对象,以及字符串、char[]数组和byte[]数组。这些通常是非常短暂的,并且很快就会被收集起来,但是大量的伐木将会充实年轻一代并有助于晋升。

\n\n

在 HotSpot JVM 上,即使是较小的收集也是使用所有当前 GC 算法的停止世界收集:串行、并行、并发、CMS 和 G1。(这对ShenandoahZGC的影响可能会较小,但在撰写本文时这些收集器仍处于实验阶段。另请注意,Zing/Azul有一个无暂停的收集器,但该工作尚未贡献给 OpenJDK。)

\n\n

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

\n