当停我的项目,tomcat的说:
下面的Web应用程序被停止(重新加载,未展开的),但是从之前的运行他们的课堂仍然加载到内存中,从而导致内存泄漏(使用一个分析器确认)。
当我们发现哪些类留在记忆?
请帮我 。
当停我的项目,tomcat的说:
下面的Web应用程序被停止(重新加载,未展开的),但是从之前的运行他们的课堂仍然加载到内存中,从而导致内存泄漏(使用一个分析器确认)。
当我们发现哪些类留在记忆?
请帮我 。
您可以运行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>
另一种方法是使类加载调试信息,并做一些脚本,以检测剩下加载。
发生这种情况时,一般有东西在内存里面是“钉住”的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用户,让我们知道缺少了什么:我们会添加它。