在Tomcat Web应用程序中读取序列化数据时发生奇怪的内存泄漏

时间:2011-03-14 01:10:22

标签: java web-applications tomcat servlets memory-leaks

我正在向Tomcat 7.0.8(JVM 1.6)部署一个相对简单的Web应用程序。

该应用程序注册了一个ServletContextListener,并且在WEB-INF中有一个名为“data”的资源。 “data”文件包含一个名为Data的简单类的单个序列化实例。数据有一些公共字符串和整数字段,但没有别的。它实现了Serializable并定义了自己的serialVersionUID。

在比赛监听器中,contextInitialized()执行以下操作:

  1. 从ServletContext
  2. 获取一个InputStream为“data”
  3. 从InputStream创建一个ObjectInputStream,
  4. 从ObjectInputStream中读取单个对象
  5. 将其投射到“数据”类型
  6. 将字段值写入System.out,
  7. 关闭ObjectInputStream及其支持InputStream。
  8. 一切似乎都很好。 然而当我通过Tomcat的管理器应用程序停止webapp,然后检查内存泄漏时,Tomcat通知我,我的应用程序在停止时泄漏了内存。

    我很肯定问题在于Data类,因为当我序列化String或Integer时,我没有看到泄漏。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果在初始化Web应用程序时读入此文件一次,内存泄漏如何显着?它甚至值得称赞吗?

内存泄漏对Tomcat和所有应用服务器都很重要,因为它们可能会长时间保持活着状态。内存泄漏只有在较长时间内出现时才会出现问题。

你的直觉很好,但我认为你的程序存在缺陷。

我建议你使用一个更好的工具 - 与JDK 6及更高版本捆绑在一起的Visual VM - 并且在你的Tomcat以更接近你的实际生产需求的方式使用时监控你的Tomcat。

您无法从单个请求中得出有关内存泄漏的任何结论。