tomcat - 以前运行的类仍然在内存中加载

Ali*_*ozi 5 jsp tomcat memory-leaks servlets

停止我的项目时,tomcat说:

以下Web应用程序已停止(重新加载,取消部署),但之前运行的类仍然在内存中加载,从而导致内存泄漏(使用分析器确认).

我们在哪里发现哪些类留在内存中?

请帮我 .

min*_*das 11

您可以运行jmap -histo哪个将显示已加载的类.

例如:

jmap -histo[:live] <pid>
    to connect to running process and print histogram of java object heap
    if the "live" suboption is specified, only count live objects

Example: jmap -dump:live,format=b,file=heap.bin <pid>
Run Code Online (Sandbox Code Playgroud)

另一种方法是启用类加载调试信息并执行一些脚本来检测剩余的内容.


Chr*_*ltz 8

当发生这种情况时,通常内存中会有一些东西将WebappClassLoader(负责为webapp实例加载类的类加载器)"固定"到内存中.如果多次重新加载webapp,您将能够看到每次重新加载时WebappClassLoader实例的数量增加1.这通常不是 Tomcat中的泄漏,而是直接在您的webapp代码中泄漏,您使用的库中的泄漏,或由执行愚蠢事情的一些特定Java API调用触发的泄漏.

首先,请阅读:http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf.这是一个很好的描述究竟发生了什么.

其次,使用分析器来确定什么是对WebappClassLoader加载的对象的引用.很多时候,只需使用ServletContextListener就可以在webapp被停止时清理这些引用.

第三,如果您发现您使用的库有泄漏,请让他们知道.如果您发现来自JRE中的类的泄漏,请查看使用JreMemoryLeakPreventionListener的选项:http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html#JRE_Memory_Leak_Prevention_Listener_-_org.apache .catalina.core.JreMemoryLeakPreventionListener.如果您找不到任何选项,请选择Tomcat用户,并告诉我们缺少的内容:我们将添加它.