PageOutputStream导致java.lang.OutOfMemory

时间:2013-04-21 20:52:30

标签: java tomcat struts2 heap out-of-memory

我们在Tomcat 7中运行的struts2 Web应用程序间歇性地遇到同样的问题:

  1. 应用程序正常运行
  2. 经过一段可变的时间(从10分钟到7天不等),应用程序变慢停止
  3. catalina.out中的多个java.lang.OutOfMemory错误
  4. Linux free -m显示所有物理和交换内存已用完(即使我在setenv.sh中设置了Xmx8G)
  5. 我已经将Tomcat配置为在OutOfMemory上创建自动堆转储,当我在Eclipse中使用jmap或MAT分析转储时,每个转储都显示相同的内容。所有内存都占用了近一百万个java.util.LinkedList $ Node,它们似乎是由PageOutputStream生成的。

    Eclipse MAT Histogram

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

    我想知道是否有人知道一种方法可以将这个问题进一步分解为一行代码或一个jsp页面?

1 个答案:

答案 0 :(得分:0)

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

在JSP中显示它们

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