Tomcat的 - 从之前的运行他们的课堂仍然加载到内存中(tomcat - their class

2019-06-24 19:45发布

当停我的项目,tomcat的说:

下面的Web应用程序被停止(重新加载,未展开的),但是从之前的运行他们的课堂仍然加载到内存中,从而导致内存泄漏(使用一个分析器确认)。

当我们发现哪些类留在记忆?

请帮我 。

Answer 1:

您可以运行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>

另一种方法是使类加载调试信息,并做一些脚本,以检测剩下加载。



Answer 2:

发生这种情况时,一般有东西在内存里面是“钉住”的WebappClassLoader(类加载器是负责加载类你的web应用的一个实例)到内存中。 如果你重装你的web应用几次,你就能看到WebappClassLoader实例的数量由1都在增加重新加载执行。 这通常不是在Tomcat中泄漏,而是在你的web应用程序的代码泄漏直接,在你使用一个库泄漏,或通过做蠢事几个特定的Java API调用引发了泄漏。

首先,请仔细阅读本: http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf 。 这究竟是发生了一个很好的说明。

其次,使用一个分析器,以确定是什么阻碍到你的WebappClassLoader加载的对象的引用。 随着Web应用程序被停止很多次,只是使用的ServletContextListener可以清理那些引用。

第三,如果你发现有一个从你使用一个库来泄漏,请让他们知道这件事。 如果您发现从JRE类未来泄漏,然后再看选项使用JreMemoryLeakPreventionListener: http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html#JRE_Memory_Leak_Prevention_Listener_-_org.apache .catalina.core.JreMemoryLeakPreventionListener 。 如果没有选择任何你已经找到,请落由Tomcat用户,让我们知道缺少了什么:我们会添加它。



文章来源: tomcat - their classes from previous runs are still loaded in memory