可以记录一条巨大的消息(大约90 MB)导致OutOfMemory错误? (最大堆大小:2048M)

时间:2016-07-06 08:15:18

标签: java

实际上,我通过RabbitMQ收到一条很大的消息。 在使用此消息时,我们会记录它。

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

我在logger语句行的日志中看到以下异常。

  

引起:java.lang.OutOfMemoryError:Java堆空间       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)       在java.lang.StringBuffer.append(StringBuffer.java:272)       在org.apache.log4j.helpers.PatternParser $ LiteralPatternConverter.format(PatternParser.java:419)       在org.apache.log4j.PatternLayout.format(PatternLayout.java:506)       在org.graylog2.GelfMessageFactory.makeMessage(GelfMessageFactory.java:37)       在org.graylog2.log.GelfAppender.append(GelfAppender.java:220)       在org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)       在org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)       在org.apache.log4j.Category.callAppenders(Category.java:206)       在org.apache.log4j.Category.forcedLog(Category.java:391)       在org.apache.log4j.Category.log(Category.java:856)       at org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:324)

删除logger语句后,消息处理成功。

那么,我可以确定记录器是否导致OutOfMemoryError? 或者它是导致OutOfMemoryError

的其他因素

堆大小为:2048M

3 个答案:

答案 0 :(得分:1)

问:那么,我可以确定记录器是否导致OutOfMemory错误?或者它是导致OutOfMemory错误的其他原因?

基于堆栈跟踪,是的。

从跟踪中您可以清楚地看到您的log4j模块(logger对象)正在尝试执行copyOf()操作,但在复制完成之前,程序因OutOfMemoryException而死亡。

至于你通常如何读取堆栈跟踪,这个stackoverflow帖子可以提供很大的帮助。

How to read and understand the java stack trace?

<强>引用:

  

一般来说,Exception的确切原因是在第一行   您的堆栈跟踪,以及有关其原因的更多信息   例外,你需要逐步向下移动,根本原因可以   经常被发现在靠近堆栈轨迹底部的地方。

我通常会读取堆栈跟踪的第一行以确定发生了什么,因为您的原因是OOM错误,然后我移动到最后一行并从下往上读取以查看哪个object或区域可能导致错误的代码。

答案 1 :(得分:0)

在应用程序的启动脚本中,分配给应用程序的初始堆大小的内存参数以及相同的最大堆大小

有关详细信息,请参阅this。 用于此目的的启动命令可以从

开始

java -Xmx12288m&lt;(其他必要参数后跟)&gt;

下面给出了一个示例命令供您参考

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

答案 2 :(得分:0)

我的申请遇到了类似的问题,但它与春天有关。在我的代码中,某种自动装配的依赖类被标记为抽象,我开始在服务器启动时遇到此问题。

经过近一天的研究,我们能够确定问题并加以解决。