我正在(测试)在Tomcat 7中运行我的web应用程序,并使用他们的“查找泄漏”按钮,当然,当我停止/取消部署时,它会抱怨内存泄漏。
以下web应用程序已停止(重新加载、未部署),但它们以前运行的类仍然加载在内存中,从而导致内存泄漏(使用探查器确认):/LeakyWebApp
所以我使用了Java VisualVM (这是我第一次尝试这个)
没有部署的Tomcat启动时的: http://img15.imageshack.us/img15/4441/tomcatstartup.jpg
我的网络应用程序包括:
1.8.5
部署后立即使用: http://img850.imageshack.us/img850/2951/tomcatafterdeployment.jpg
因此,我注意到它抱怨Quartz,我还在某个地方读到关闭servlet破坏上的Hibernate会话工厂的文章。
在停止/取消部署时,Visual确实显示Quartz线程已停止,但是tomcat日志显示
“似乎启动了一个名为.的线程,但未能阻止它”
因此,我创建了一个新的ServletContextListener,并在contextDestroyed上调用Quartz工厂调度程序来关机,并在Hibernate会话工厂上调用close。在执行另一个部署/取消部署时,不会再从tomcat日志中抱怨Quartz线程问题了。
然而,当我使用“查找泄漏”时,它仍然抱怨同样的事情。
以下web应用程序已停止(重新加载、未部署),但它们以前运行的类仍然加载在内存中,从而导致内存泄漏(使用探查器确认):/LeakyWebApp
然后我发现了另一个关于JDBC驱动程序的抱怨(我在war中有mysql连接器jar ),所以我尝试删除它,tomcat日志中的抱怨消失了,但是“查找泄漏”仍然和我的web应用程序有内存泄漏一样。
所以我的问题是-我还应该看什么?和/或如何更好地使用Visual来检测正在发生的事情?
谢谢
编辑:我根据大卫·费托萨的帖子修正了石英的问题,我失踪了
<init-param>
<param-name>wait-on-shutdown</param-name>
<param-value>true</param-value>
</init-param>来自web.xml中的石英属性。
然而-我仍然有JDBC驱动程序的问题-我需要它为我的web应用程序,似乎我有两个解决方案的基础上的答案:To prevent a memory leak, the JDBC Driver has been forcibly unregistered。
将mysql-连接器jar放在tomcat/lib
中不注册驱动程序。
我该走哪条路,这方面的最佳实践是什么?
发布于 2012-04-24 14:53:37
我在这种web应用程序中发现的大部分内存泄漏问题都与Quartz有关。为了解决这个问题,尝试使用适当的Quartz Servlet来插入工厂:http://quartz-scheduler.org/api/2.0.0/org/quartz/ee/servlet/QuartzInitializerServlet.html
在Quartz文档中,尝试使用:
<servlet>
<servlet-name>
QuartzInitializer
</servlet-name>
<display-name>
Quartz Initializer Servlet
</display-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
</servlet-class>
<load-on-startup>
1
</load-on-startup>
<init-param>
<param-name>config-file</param-name>
<param-value>/some/path/my_quartz.properties</param-value>
</init-param>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>wait-on-shutdown</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</init-param>
</servlet>希望这能帮到你。
https://stackoverflow.com/questions/10300288
复制相似问题