2016-07-06 85 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