java.lang.OutOfMemoryError:log4j2中存在堆栈溢出问题的java堆空间



调用logger.error(例如getMessage((,ex(时导致stackoverflow和java.lang.OutOfMemoryError:java堆空间,并重复调用以下stacktrace。它在我们的应用程序上随机发生。Log4j2版本为2.17.0

at org.apache.logging.log4j.spi.AbstractLogger.handleLogMessageException(Ljava/lang/Throwable;Ljava/lang/String;Lorg/apache/logging/log4j/message/Message;)V (AbstractLogger.java:2225)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(Ljava/lang/String;Ljava/lang/StackTraceElement;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Lorg/apache/logging/log4j/message/Message;Ljava/lang/Throwable;)V (AbstractLogger.java:2208)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Lorg/apache/logging/log4j/message/Message;Ljava/lang/Throwable;)V (AbstractLogger.java:2159)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Lorg/apache/logging/log4j/message/Message;Ljava/lang/Throwable;)V (AbstractLogger.java:2142)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V (AbstractLogger.java:2058)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V (AbstractLogger.java:1931)
at org.apache.logging.log4j.spi.AbstractLogger.warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V (AbstractLogger.java:2805)
at org.apache.logging.log4j.spi.AbstractLogger.handleLogMessageException(Ljava/lang/Throwable;Ljava/lang/String;Lorg/apache/logging/log4j/message/Message;)V (AbstractLogger.java:2225)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(Ljava/lang/String;Ljava/lang/StackTraceElement;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Lorg/apache/logging/log4j/message/Message;Ljava/lang/Throwable;)V (AbstractLogger.java:2208)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Lorg/apache/logging/log4j/message/Message;Ljava/lang/Throwable;)V (AbstractLogger.java:2159)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Lorg/apache/logging/log4j/message/Message;Ljava/lang/Throwable;)V (AbstractLogger.java:2142)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Ljava/lang/String;Ljava/lang/Throwable;)V (AbstractLogger.java:2017)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Ljava/lang/String;Ljava/lang/Throwable;)V (AbstractLogger.java:1983)
at org.apache.logging.slf4j.Log4jLogger.error(Ljava/lang/String;Ljava/lang/Throwable;)V (Log4jLogger.java:319)

Lo4j2.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config"
packages="custom.appender">
<Appenders>
<Routing name="CustomRouting">
<Routes pattern="${sys:pathToLogfile}">
<Route>
<CustomRollingRandomAccessFile name="FILE"
fileName="${sys:pathToLogfile}/${date:yyyy-MM-dd}.log"
filePattern="${sys:pathToLogfile}/%d{yyyy-MM-dd}.log.gz"
immediateFlush="true" append="true">
<PatternLayout pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss zzz} | [%t] %C{2} (%F:%L) - %m | %X%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${sys:pathToLogfile}">
<IfFileName glob="//*.log.gz" />
<IfLastModified age="60d" />
</Delete>
</DefaultRolloverStrategy>
</CustomRollingRandomAccessFile>
</Route>
</Routes>
</Routing>      
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss zzz} [%t] %C{2} (%F:%L) - %m | %X%n" />
</Console>
</Appenders>
<Loggers>
<Root level="ERROR" includeLocation="true" >            
<AppenderRef ref="CustomRouting">
<ThreadContextMapFilter onMatch="DENY" onMismatch="ACCEPT">
<KeyValuePair key="Dir" value="customval" />
</ThreadContextMapFilter>
</AppenderRef>
</Root>
</Loggers>
</Configuration>

如果内存不足,那么在这种情况下运行哪个操作完全是随机的。它可以是日志记录,也可以是其他任何东西。

您必须监控您的应用程序和

  • 提供更多内存(如果显示分配的内存不足(
  • 或者修复内存泄漏。适当的监控会显示一段时间内内存的使用情况

如果内存使用量只会增加(而垃圾收集并没有将其降低到持续的低水平(,那么很可能是内存泄漏。在这种情况下分配更多内存可能会为您争取一些时间(例如,您可能可以使用两周(,但这并不能解决问题。

但日志记录很可能没有什么问题。它只是在内存由于其他故障组件或分配的资源不足而耗尽时运行的操作。

编辑:不知怎么的,我错过了你问题中堆叠的部分——很可能是";每周一次";误导我得出初步结论。

请用更多信息编辑您的问题-例如,您是如何配置日志记录的,如果总是在同一时间发生,那么当时是否有一些预定的事件(例如日志轮换或每周一次的预定任务(?

如果你绝对肯定这是一个与log4j相关的问题,我的假设是它在(未经证实的(log4j配置中,而不是编程问题。

最新更新