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

时间:2012-05-25 14:05:41

标签: jsp tomcat servlets memory-leaks

当停止我的项目时,tomcat说:

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

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

请帮帮我。

2 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:8)

当发生这种情况时,通常记忆中有一些东西是&#34;固定&#34; 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用户&#39;让我们知道缺少什么:我们将其添加。