java - PageOutputStream 导致 java.lang.OutOfMemory

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

我们有一个在 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 分析转储时,每个转储都显示相同的内容。所有内存都被将近 100 万个 java.util.LinkedList$Node 占用,这些 java.util.LinkedList$Node 似乎是由 PageOutputStream 生成的。

Eclipse MAT Histogram

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

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

最佳答案

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

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

关于java - PageOutputStream 导致 java.lang.OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16136085/

相关文章:

java - 使用 Dropzone.js 在 Struts2 中上传多个文件

java - struts2 在迭代器标签中包含测试

java - 无法加载bean : type:org. apache.struts2.views.gxp.inject.InjectedObjectContainer

java - 处理 protobuffers 中的空值

java - 使用序列化深度克隆后 hibernate 延迟加载异常

java - Dropwizard Spring 数据库

java - 从外部访问 WAR 文件

struts2 - 如何将 Struts 约定与 Tiles 集成以保持约定的好处

java - 在我的动态 Web 项目中运行 Tomcat 服务器时出错

java - 等到tomcat完成启动