1

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

  1. 应用程序完美正常运行
  2. 在一段时间后(从 10 分钟到 7 天不等),应用程序减速到停止
  3. catalina.out 中的多个 java.lang.OutOfMemory 错误
  4. Linux free -m 显示所有物理和交换内存已用完(即使我在 setenv.sh 中设置了 Xmx8G)

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

Eclipse MAT 直方图

由于这些节点似乎是由 PageOutputStream 生成的,它是 Struts 中页面渲染的一部分,我的想法是在我们的一个 JSP 页面中有一个无限循环的 Struts 标签,它正在创建所有这些链表节点,但我很难理解如何我可能会找出那个页面可能是什么。

我想知道是否有人知道将这个问题进一步隔离到一行代码或一个jsp页面的方法?

4

1 回答 1

0

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

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

于 2013-11-19T17:14:06.933 回答