AdSense

網頁

2025/5/1

Java Log4j2 java.lang.OutOfMemoryError Java: heap space

今天執行程式發生java.lang.OutOfMemoryError Java heap space錯誤,看log是log4j2在印log時所引發。


查了一下原因出在log.debug是寫在loop中,印出的資料為sql query的查詢結果,例如

for (...) {
     log.debug(resultMap);
}

而這會在heap產生並累積大量的String物件,在loop或方法完成前都無法被垃圾回收(GC),導致內存洩漏。

結論是避免在loop迴圈裡面用log印太多的資料。

下面是錯誤發生時的log紀錄。

Caused by: java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3746) ~[?:?]
	at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:172) ~[?:?]
	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538) ~[?:?]
	at java.lang.StringBuilder.append(StringBuilder.java:174) ~[?:?]
	at org.apache.logging.log4j.message.ParameterFormatter.appendArray(ParameterFormatter.java:507) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.appendPotentiallyRecursiveValue(ParameterFormatter.java:496) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.recursiveDeepToString(ParameterFormatter.java:456) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.appendMap(ParameterFormatter.java:573) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.appendPotentiallyRecursiveValue(ParameterFormatter.java:498) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.recursiveDeepToString(ParameterFormatter.java:456) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.appendCollection(ParameterFormatter.java:598) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.appendPotentiallyRecursiveValue(ParameterFormatter.java:500) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.recursiveDeepToString(ParameterFormatter.java:456) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterFormatter.formatMessage2(ParameterFormatter.java:189) ~[log4j-api-2.12.1.jar!/:2.12.1]
	at org.apache.logging.log4j.message.ParameterizedMessage.formatTo(ParameterizedMessage.java:228) ~[log4j-api-2.12.1.jar!/:2.12.1]


沒有留言:

AdSense