2012-04-24 25 views
4

我(測試)在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

  1. 將使用mysql-connector一罐Tomcat的/ lib中
  2. 手動取消註冊在contextDestroyed驅動程序。

我應該走哪條路,什麼是最好的做法呢?

回答

4

大多數與我在這樣的web應用程序的有關石英發現內存泄漏的問題。爲了解決這個問題,嘗試使用適當的石英Servlet來初始化工廠:http://quartz-scheduler.org/api/2.0.0/org/quartz/ee/servlet/QuartzInitializerServlet.html

如石英文檔,請嘗試使用方法:

<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> 

希望這可以幫助你。

+0

謝謝,我只是錯過了「等待在關機」的屬性,它修復該問題。但是,我仍然有JDBC驅動程序「[leakyApp]註冊JDBC驅動程序,但沒有註銷其」問題 - 這來自於一個事實,我在我的web應用程序使用mysql-connector-java.jar,但我可以」不要刪除它,因爲我需要它 - 我能爲這個問題做些什麼? – 2012-04-24 15:00:36

+0

不快樂,我對於駕駛者的問題沒有線索呢。如果我找到了,我會回到這裏。你可以查看你的服務器文檔嗎?也許在Tomcat或JBoss中使用DataSource對象可以解決您的驅動程序問題。 – 2012-04-24 15:21:54

+0

你好,我面臨着同樣的問題,但我怎麼能把這個Servlet添加到我的應用程序中......我可以創建新的Servlet類,並將war文件部署到tomcat中。 – Kanchetianeel 2014-12-03 04:48:39