2016-07-06 52 views
0

實際上,我通過RabbitMQ收到一封很大的郵件。 消耗此消息時,我們會記錄它。可以記錄一條巨大的消息(大約90 MB)會導致OutOfMemory錯誤? (最大堆大小:2048M)

logger.info("payload: {}", payload); 

我在記錄器語句行的日誌中看到以下異常。

Caused by: java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137) at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421) at java.lang.StringBuffer.append(StringBuffer.java:272) at org.apache.log4j.helpers.PatternParser$LiteralPatternConverter.format(PatternParser.java:419) at org.apache.log4j.PatternLayout.format(PatternLayout.java:506) at org.graylog2.GelfMessageFactory.makeMessage(GelfMessageFactory.java:37) at org.graylog2.log.GelfAppender.append(GelfAppender.java:220) at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) at org.apache.log4j.Category.callAppenders(Category.java:206) at org.apache.log4j.Category.forcedLog(Category.java:391) at org.apache.log4j.Category.log(Category.java:856) at org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:324)

擺脫記錄器語句後,消息已成功處理。

所以,我可以確定記錄器導致OutOfMemoryError? 或者這是導致OutOfMemoryError

堆大小爲:2048M

+1

不確定看起來像它。你的堆空間大小是多少?嘗試使用-Xmx參數將更多堆空間分配給JVM。 – daZza

+0

[增加eclipse中的堆空間:(java.lang.OutOfMemoryError)]可能的重複(http://stackoverflow.com/questions/8600972/increasing-heap-space-in-eclipse-java-lang-outofmemoryerror) –

+0

@ JordiCastilla可能不是。OP只是要求幫助來驗證它是否是引發OutOfMem異常的'logger'對象。 –

回答

1

問:所以,我可以肯定的是,記錄器導致內存溢出的錯誤?或者是導致OutOfMemory錯誤的其他內容?

答: 根據堆棧跟蹤,是的。

從跟蹤中,您可以明顯看到您的log4j模塊(它是logger對象)試圖執行copyOf()操作,但在複製完成之前程序因OutOfMemoryException而死亡。

至於你通常如何閱讀堆棧跟蹤,這個stackoverflow後可以是一個很大的幫助。

How to read and understand the java stack trace?

報價:

Generally the exact reason for the Exception is at the first line of your Stack Trace, and for more information about the cause of that exception, you need to gradually move down, and the root cause can often be found somewhere near the bottom of the stack trace.

我大致看了堆棧跟蹤的第一行,以確定發生了什麼,爲您的事業將是OOM錯誤,然後我移到最後一行並從下往上讀取以查看哪個object或可能導致故障的代碼區域。

0

在應用程序中的啓動腳本,對於相同的

分配給應用程序的初始堆大小,最大堆大小內存參數請詳細信息請參this。 爲目的的啓動命令可以與開始的東西等

的java -Xmx12288m <(接着其它必要的參數)>

的樣本命令下面給出供參考

java -Xms1024m -Xmx12288m -XX:MaxPermSize=256m -Dlaser.home=$LASER_HOME -Djob=$job -Djava.library.path=$HADOOP_NATIVE -classpath "$CLASSPATH" $job_runner insights-workflow.xml $job run.date=$runDate env.type=$env