我正在(测试)在Tomcat 7中运行我的网络应用程序并使用他们的“查找泄漏”按钮,当然当我停止/取消部署时它会抱怨内存泄漏。
以下 Web 应用程序已停止(重新加载、取消部署),但它们之前运行的类仍加载到内存中,从而导致内存泄漏(使用分析器确认):/LeakyWebApp
所以我使用了 Java VisualVM(我第一次尝试这个)
在没有部署的 Tomcat 启动上:http: //img15.imageshack.us/img15/4441/tomcatstartup.jpg
我的网络应用程序涉及:
- 石英 1.8.5
- 休眠 3.6.3
- JAXB 2.2.4
- 销售人员 API
- 日志4j
部署后立即:http: //img850.imageshack.us/img850/2951/tomcatafterdeployment.jpg
所以我注意到它抱怨 Quartz,我还在某处读到了在 servlet 销毁时关闭 Hibernate Session Factory。
在停止/取消部署时,Visual VM 确实显示 Quartz 线程已停止,但 tomcat 日志显示
“似乎启动了一个名为 ... 的线程,但未能停止它”
所以我创建了一个新的 ServletContextListener 并在 contextDestroyed 上调用 Quartz 工厂调度程序来关闭并在 Hibernate Session Factory 上调用 close。并进行另一次部署/取消部署,tomcat 日志不再抱怨上述 Quartz 线程问题。
但是,当我使用“查找泄漏”时,它仍然抱怨同样的事情
以下 Web 应用程序已停止(重新加载、取消部署),但它们之前运行的类仍加载到内存中,从而导致内存泄漏(使用分析器确认):/LeakyWebApp
然后我发现另一个关于 JDBC 驱动程序的抱怨(我的战争中有 mysql 连接器 jar),所以我尝试删除它,来自 tomcat 日志的抱怨消失了,但“查找泄漏”仍然说我的网络应用程序有内存泄漏同样的事情
所以我的问题是——我还应该看什么?和/或如何更好地使用 Visual VM 来检测发生了什么?
谢谢
编辑: 我根据 David Feitosa 的帖子解决了 Quartz 的问题,我错过了
<init-param>
<param-name>wait-on-shutdown</param-name>
<param-value>true</param-value>
</init-param>
来自 web.xml 中的 Quartz 属性。
但是 - 我的 JDBC 驱动程序仍然存在问题 - 我的 Web 应用程序需要它,并且似乎我有 2 个基于以下答案的解决方案:为了防止内存泄漏,JDBC 驱动程序已被强制注销
- 将 mysql-connector jar 放入 tomcat/lib
- 在 contextDestroyed 中手动取消注册驱动程序。
我应该走哪条路,最好的做法是什么?