2013-04-21 52 views
1

我们有一个Struts2的Web应用程序在Tomcat中7运行间歇遇到同样的问题:PageOutputStream造成java.lang.OutOfMemory

  1. 应用完美运行正常
  2. 可变的时间量之后(从任何地方10分钟至7天)应用程序减速停止
  3. catalina.out中的多个java.lang.OutOfMemory错误
  4. Linux免费-m显示所有物理和交换内存已用尽(即使我已设置在setenv.sh中的Xmx8G)

我已经配置Tomcat在OutOfMemory上创建一个自动堆转储,当我在Eclipse中使用jmap或MAT分析转储时,每个转储都显示相同的内容。所有的内存都被接近100万的java.util.LinkedList $ Node所占用,这些似乎是由PageOutputStream生成的。

Eclipse MAT Histogram

由于这些节点似乎被PageOutputStream生成是在Struts的页面呈现的一部分,我的想法是,有Struts标签在是创造所有这些链表我们的JSP页面中的一个无限循环节点,但我正在努力了解如何找出该页面可能是什么。

我想知道是否有人知道一种方法来进一步隔离这个问题,进一步下降到一行代码或一个JSP页面?

+0

我认为你的问题应该与FastByteArrayOutpuStream,因为PageOutputStream什么都不做,它是FastByteOutputStream的包装。 – DiogoSantana 2013-04-21 21:53:53

+2

添加您正在使用的Struts2的版本,完整的堆栈跟踪,并且如果堆栈跟踪包含您的某个类/页面的代码,那么也将其发布。 – 2013-04-22 02:08:30

回答

0

我最终发现问题是JSP中被破坏的Struts标签。我在控制器中检索一组结果并在JSP中显示它们使用<s:iterator>

这些搜索结果包含一些嵌入式HTML,它创建了一个更长的迭代,而不是无限但足够长以快速消耗内存。一旦我修复了嵌入式HTML,问题就消失了。