Java 在Tomcat web app中读取序列化数据时出现奇怪的内存泄漏

Java 在Tomcat web app中读取序列化数据时出现奇怪的内存泄漏,java,web-applications,tomcat,servlets,memory-leaks,Java,Web Applications,Tomcat,Servlets,Memory Leaks,我正在将一个相对简单的web应用程序部署到Tomcat7.0.8(JVM1.6) 该应用程序注册了一个ServletContextListener,并在WEB-INF中有一个名为“data”的资源。“data”文件包含一个名为data的简单类的序列化实例。数据有几个公共字符串和整数字段,但没有其他字段。它实现Serializable并定义自己的serialVersionUID 在竞赛侦听器中,contextInitialized()执行以下操作: 从ServletContext获取到“data”

我正在将一个相对简单的web应用程序部署到Tomcat7.0.8(JVM1.6)

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

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

  • 从ServletContext获取到“data”的InputStream
  • 从InputStream创建ObjectInputStream
  • 从ObjectInputStream读取单个对象
  • 将其强制转换为“数据”类型
  • 将字段值写入System.out
  • 关闭ObjectInputStream及其备份InputStream
  • 一切似乎都很好然而当我通过Tomcat的manager应用程序停止Web应用程序,然后检查内存泄漏时,Tomcat通知我,我的应用程序在停止时内存泄漏

    我敢肯定,问题在于数据类,因为当我序列化字符串或整数时,我看不到泄漏


    有什么想法吗?

    如果在初始化web应用程序时一次读入此文件,内存泄漏的重要性如何?它甚至配得上这个头衔吗

    内存泄漏对Tomcat和所有应用程序服务器都很重要,因为它们的目的是让它们长时间保持活动状态。只有在较长时间内出现内存泄漏时,内存泄漏才会成为问题

    你的直觉很好,但我认为你的程序有缺陷

    我建议您使用一个更好的工具——与JDK 6和更高版本捆绑在一起的可视化虚拟机——并在Tomcat以更接近您实际生产需要的方式使用时监视它


    对于单个请求的内存泄漏,您无法得出任何结论。

    只读取一次。这不是一个企业应用程序,只是我为个人使用而准备的东西。这不是泄漏有多严重的问题,我只是想知道为什么Tomcat会抱怨。这是Tomcat中的一个bug,还是我真的在用一种“坏”的方式做某事?顺便说一句,我重写了序列化,使用JSON作为底层格式(使用Jackson进行序列化/反序列化),Tomcat仍然报告泄漏。此外,当我说“检查内存泄漏”时,我指的是在Manager应用程序中使用Tomcat自己的“查找泄漏”按钮。请注意,Jackson没有问题。也许Java的对象序列化在内部做了一些不明智的事情?