实际上,我通过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
答案 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)
我的申请遇到了类似的问题,但它与春天有关。在我的代码中,某种自动装配的依赖类被标记为抽象,我开始在服务器启动时遇到此问题。
经过近一天的研究,我们能够确定问题并加以解决。