【发布时间】:2016-11-08 05:22:27
【问题描述】:
实际上,我通过 RabbitMQ 收到一条很大的消息。 在使用此消息时,我们会记录它。
logger.info("payload: {}", payload);
我在记录器语句行的日志中看到以下异常。
原因:java.lang.OutOfMemoryError: Java heap space 在 java.util.Arrays.copyOf(Arrays.java:3332) 在 java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137) 在 java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121) 在 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) 在 org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:324)
去掉logger语句后,消息处理成功。
那么,我可以确定是记录器导致了OutOfMemoryError 吗?
或者是其他原因导致OutOfMemoryError?
堆大小为:2048M
【问题讨论】:
-
确实看起来像。你的堆空间是多少?尝试使用 -Xmx 参数为 JVM 分配更多堆空间。
-
@SamuelToh IMO 90mb 的日志消息不应该导致错误......但这只是我的意见......
-
@JordiCastilla - 是的,90mb 对于机器来说被认为相对较小,但奇怪的是它在
Arrays.copyOfapi 上失败了。要么 OP 的 jvm 真的有一个真正的小堆大小,或者copyOfapi 可能已经进入导致堆耗尽的无限循环? -
除了它导致这样的错误之外:将每条消息内容记录为“信息”真的有用吗?我认为这是一个性能瓶颈。不过我想,你不能简单地放弃这条线,所以你可能想要执行大小检查并将日志输出的消息切割成更小的块或只记录第一个块。
-
这看起来像是一个 XY 问题。没有充分的理由记录整条消息。你为什么这样做?
标签: java