2015-03-31 58 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