Java堆内存不足但不是真的

时间:2012-09-05 18:38:59

标签: java heap velocity turbine

因此在尝试通过Turbine servlet使用Velocity渲染页面时出现此错误。事情是我有大量的内存,而servlet本身永远不会崩溃。它只是失败了这个请求。它试图呈现的页面可能是10M。

有人有任何想法/建议吗?

 java.lang.OutOfMemoryError: Java heap space
 java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2271) at
 java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) at
 java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
 at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
 at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at
 sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282) at
 sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) at
 sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135) at
 java.io.OutputStreamWriter.write(OutputStreamWriter.java:220) at
 java.io.Writer.write(Writer.java:157) at
 org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:321)
 at
 org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
 at
 org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:109)
 at
 org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
 at
 org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:271)
 at
 org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:128)
 at
 org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
 at
 org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:271)
 at
 org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:128)
 at
 org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:271)
 at org.apache.velocity.Template.merge(Template.java:296) at
 org.apache.velocity.app.Velocity.mergeTemplate(Velocity.java:492) at
 org.apache.velocity.app.Velocity.mergeTemplate(Velocity.java:461) at
 org.apache.turbine.services.velocity.TurbineVelocityService.executeRequest(TurbineVelocityService.java:455)
 at
 org.apache.turbine.services.velocity.TurbineVelocityService.handleRequest(TurbineVelocityService.java:321)
 at
 org.apache.turbine.services.velocity.TurbineVelocity.handleRequest(TurbineVelocity.java:109)
 at
 org.apache.turbine.modules.layouts.VelocityOnlyLayout.doBuild(VelocityOnlyLayout.java:155)
 at org.apache.turbine.modules.Layout.build(Layout.java:91) at
 org.apache.turbine.modules.LayoutLoader.exec(LayoutLoader.java:138) at
 org.apache.turbine.modules.pages.DefaultPage.doBuild(DefaultPage.java:191)
 at org.apache.turbine.modules.Page.build(Page.java:91) at
 org.apache.turbine.modules.PageLoader.exec(PageLoader.java:136)

JAVA_OPTS= -Xms4096M -Xmn2048M -Xmx13128M

顶部的内存使用量永远不会超过100M。

1 个答案:

答案 0 :(得分:2)

我怀疑你的-Xmn导致了这个问题,为年轻一代预留了一大块初始堆。我建议没有这个运行你的服务器,看看会发生什么。

我的理由是失败发生在ByteArrayOutputStream.grow()上,这会创建一个比现有数组大一些百分比的新数组。大型阵列(> 512M)直接进入终生代,因此如果为年轻一代预留了太多空间,则终身可能没有足够的空间。

另一种可能性是您渲染的模板比您想象的要大得多。虽然最可能的原因是循环,但我没有在堆栈跟踪中看到它。

最后,在启动时添加-XX:+HeapDumpOnOutOfMemoryError选项。如果输出数组过大,您将在堆转储中看到这一点(使用jhat检查转储)。