我(測試)在Tomcat 7中運行我的Web應用程序,並使用他們的「查找泄漏」按鈕,當然當我停止/取消部署時它抱怨內存泄漏。Web應用程序和Tomcat 7內存泄漏
下面的Web應用程序被停止(重新加載,取消部署), 但是從之前的運行他們的課堂仍然加載到內存中,從而 造成內存泄漏(使用一個分析器確認): /LeakyWebApp
所以我用的Java VisualVM的(我第一次嘗試了這一點)
在Tomcat啓動沒有部署: http://img15.imageshack.us/img15/4441/tomcatstartup.jpg
我的web應用程序包括:
- 石英1.8.5
- 的Hibernate 3.6.3
- JAXB 2.2.4
- Salesforce的API
- log4j的
立即部署後:http://img850.imageshack.us/img850/2951/tomcatafterdeployment.jpg
所以我注意到它抱怨Quartz,我也讀了一些地方關閉Hibernate會話工廠對servlet的破壞。
在停止/取消部署,視覺VM確實顯示了石英線程停止,但tomcat的日誌說
「似乎已經開始了一個名爲線程...並未能阻止它」
因此,我創建了一個新的ServletContextListener,並在contextDestroyed上調用Quartz factory scheduler關閉並在Hibernate Session Factory上調用close。並做另一個部署/取消部署,沒有更多的抱怨從tomcat日誌有關上面的石英線程問題。
然而,當我使用「查找泄漏」它仍然抱怨
下面的Web應用程序被停止了同樣的事情(重新加載,取消部署), 但是從之前的運行他們的課堂仍然加載到內存中,從而 造成內存泄漏(使用一個分析器確認): /LeakyWebApp
隨後我發現另一個抱怨JDBC驅動程序(我在戰爭中的MySQL連接器JAR),所以我試圖刪除的是,從tomcat日誌dis投訴出現,但「查找泄漏」仍然說我的網絡應用程序有內存泄漏同樣的事情
所以我的問題是 - 我應該看什麼?和/或我如何更好地使用Visual VM來檢測發生了什麼?
感謝
編輯: 我固定立足崗位由大衛費託薩與石英的問題,我缺少
<init-param>
<param-name>wait-on-shutdown</param-name>
<param-value>true</param-value>
</init-param>
在web.xml中的石英特性
。
不過 - 我仍然有JDBC驅動程序的問題 - 我需要爲我的web應用程序,並且好像我有一個基於從答案2個解決方案:To prevent a memory leak, the JDBC Driver has been forcibly unregistered
- 將使用mysql-connector一罐Tomcat的/ lib中
- 手動取消註冊在contextDestroyed驅動程序。
我應該走哪條路,什麼是最好的做法呢?
謝謝,我只是錯過了「等待在關機」的屬性,它修復該問題。但是,我仍然有JDBC驅動程序「[leakyApp]註冊JDBC驅動程序,但沒有註銷其」問題 - 這來自於一個事實,我在我的web應用程序使用mysql-connector-java.jar,但我可以」不要刪除它,因爲我需要它 - 我能爲這個問題做些什麼? – 2012-04-24 15:00:36
不快樂,我對於駕駛者的問題沒有線索呢。如果我找到了,我會回到這裏。你可以查看你的服務器文檔嗎?也許在Tomcat或JBoss中使用DataSource對象可以解決您的驅動程序問題。 – 2012-04-24 15:21:54
你好,我面臨着同樣的問題,但我怎麼能把這個Servlet添加到我的應用程序中......我可以創建新的Servlet類,並將war文件部署到tomcat中。 – Kanchetianeel 2014-12-03 04:48:39