今天執行程式發生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]
沒有留言:
張貼留言