当前位置: 首页 > 知识库问答 >
问题:

Log4j2中是否使用java本机内存?我在本机内存而不是堆中发现了许多日志

夏晋
2023-03-14

我们有一个java应用程序,它是通过运行主功能启动的,我们还在springboot中启动嵌入式jetty作为webcontainer。我发现java head达到了最大大小,但堆使用率很低,java耗尽了被OS杀死的本机内存

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

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

我们使用log4j2和slf4j作为日志工具。日志由名称以'qtp'开头的jetty线程打印。我们设置立即Flush="false"SizeBasedTriggeringPolicy size="10MB"

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

共有1个答案

耿锦
2023-03-14

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

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

其他不具备此功能的日志库通常会分配许多LogEvent对象以及字符串、字符数组和字节数组。这些日志通常很短,收集很快,但重要的日志记录将填充年轻一代,并有助于提升。

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

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

 类似资料:
  • 我理解JVM如何从OS提供的可用本机堆中创建java堆。

  • 问题内容: 有什么工具可以知道我的Java应用程序已使用了多少个本机内存?我的应用程序内存不足:当前设置是:-Xmx900m 计算机,Windows 2003 Server 32位,RAM 4GB。 还在Windows上将boot.ini更改为/ 3GB,会有什么不同吗?如果设置为Xmx900m,则可以为此进程分配多少最大本机内存?是1100m吗? 问题答案: (就我而言,我使用的是Java 8)

  • 我想使用Hazelcast 3.5.2高密度内存存储功能。然而,我不能使它工作。 根据Hazelcast文档,我配置了我的Hazelcast服务器。 我的Java源代码: 即使我选择以编程方式配置为 另一个问题是,在放置了大约2.00.000个条目后,Hazelcast enterprise server被异常停止: 有没有人遇到这个案子能给我个建议? 感谢并致以最良好的问候,

  • 问题内容: 如果您运行的代码调用Java中的本机库,那么当内存分配应在对象的生存期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。 我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装了已编译的OpenCL内核及其所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法,您可以调用该

  • Java1.8。0_131 Windows Server 2012 R2。 “-Xmx=9000m”。但是Windows任务管理器显示java进程使用的内存超过14GB。 NMT显示“内部”消耗超过4.5 GB的内存。为什么会出现这种情况?我知道为本机内存定义空间不是Java功能。但是有什么方法可以限制“内部”内存吗? 总计:保留=15782485KB,提交=14653869KB-Java堆(保留

  • 我有一个很小的java控制台应用程序,我想在内存使用方面进行优化。它是在Xmx设置为仅64MB的情况下运行的。根据不同的监视工具(htop、ps、pmap、Dynatrace)显示进程的总体内存使用量超过250MB。我主要在Ubuntu18上运行它(也在其他操作系统上测试)。 我使用了-xx:nativeMemoryTracking,java param和jcmd的本地内存跟踪,以找出为什么在堆之