2015-03-31 57 views
1

我已經搜索並搜索了stackoverflow,很多但找不到答案。內存泄露 - Tomcat,Spring MVC

我有一個Maven,Spring MVC Web應用程序,連接到MySQL數據庫。
的問題是,每次我重新部署的時間(停止,取消再部署)我的戰爭文件,我得到的日誌文件中的下列情況除外:

SEVERE: The web application [/XYZ-0.0.0] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
SEVERE: The web application [/XYZ-0.0.0] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. 

+ -5重新部署後,我得到java.lang.OutOfMemoryError: PermGen space錯誤,需要重新啓動Tomcat - 有時我必須重啓我的機器。

我已經看了:To prevent a memory leak, the JDBC Driver has been forcibly unregistered並試圖選擇3(不知道如何什麼移動到Tomcat的/lib目錄,即做我 '移動' 彈簧JDBC或使用mysql-connector-java嗎?)

我已經實現了一個連接池,試圖解決這個問題,但它沒有幫助。

我使用Netbeans,但是我已經安裝了Tomcat 7的'windows版本',即沒有catalina.bat文件的版本,因此我無法啓動並運行探查器。 (我想不重新安裝Tomcat ...)

請幫忙 - 如何找到並修復內存泄漏?

+0

你需要添加'classesToInitialize =「com.mysql.jdbc.NonRegisteringDriver」'來server.xml中的Listener聲明。請看看http://stackoverflow.com/questions/24850091/the-web-application-registered-the-jdbc-driver-com-mysql-jdbc-driver-but-fa/24850221#24850221 – 2015-03-31 16:53:36

+0

謝謝ksokol ,我已經嘗試過了(將mysql-connector-java-5.1.30.jar移動到Tomcat 7.0 \ lib \,並在我的pom中將其標記爲'provided'並編輯了server.xml文件),但Tomcat仍然警告內存泄漏當我部署,使用webapp,停止和取消部署。 – TungstenX 2015-04-01 07:46:44

+0

我注意到,幾分鐘後內存「消失」,即如果我點擊「查找泄漏」並發現泄漏,然後等待幾分鐘,然後再次單擊它就沒有泄漏。 – TungstenX 2015-04-07 10:02:33

回答

0

您可以手動卸載ServletContextlistener的contextDestroyed方法內的所有JDBC驅動程序。你可以找到例子代碼在這裏:To prevent a memory leak, the JDBC Driver has been forcibly unregistered

你也應該考慮到把JDBC驅動程序到TOMCAT_HOME/lib文件夾,而不是你的戰爭中提供它的讓司機只是加載,而不是一次一次在每調動一次的每個Web應用程序。

單擊Tomcat管理器中的「查找泄漏」按鈕後,您收到的消息有點令人誤解。這個消息只是表明來自先前部署的實例的一些類仍然被加載,並且垃圾收集器尚未卸載它們,但稍後可以卸載它們。

我最近回答了類似的問題,並解釋有如何找到內存泄漏有關的Tomcat Web應用程序:Tomcat memory Leak