内存泄漏 - Tomcat、Spring MVC
Posted
技术标签:
【中文标题】内存泄漏 - Tomcat、Spring MVC【英文标题】:Memory leak - Tomcat, Spring MVC 【发布时间】:2015-06-04 19:28:19 【问题描述】:我用谷歌搜索过***,但找不到答案。
我有一个 Maven、Spring MVC Web 应用程序,它连接到 mysql 数据库。 问题是每次我重新部署(停止、取消部署然后部署)我的 war 文件时,我都会在日志文件中得到以下异常:
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(不确定 如何 或 what 移动到 Tomcat 的 /lib
目录,即,我是否move' spring-jdbc 还是 mysql-connector-java?)
我已经实现了一个连接池来试图解决这个问题,但它没有帮助。
我使用 Netbeans,但我安装了 Tomcat 7 的“windows 版本”,即没有 catalina.bat 文件的版本,因此我无法启动并运行分析器。 (我不想重新安装Tomcat...)
请帮助 - 我如何找到并修复内存泄漏?
【问题讨论】:
您需要将classesToInitialize="com.mysql.jdbc.NonRegisteringDriver"
添加到 server.xml 中的侦听器声明中。请看***.com/questions/24850091/…
谢谢 ksokol,我已经尝试过了(将 mysql-connector-java-5.1.30.jar 移动到 Tomcat 7.0\lib\ 并在我的 pom 中将其标记为 provided
并编辑了server.xml 文件),但当我部署、使用 webapp、停止和取消部署时,Tomcat 仍然会警告内存泄漏。
我注意到几分钟后内存“消失”了,即如果我点击Find leaks
并发现泄漏,然后等待几分钟并再次单击它没有泄漏...
【参考方案1】:
您可以在 ServletContextlistener 的 contextDestroyed 方法中手动卸载所有 JDBC 驱动程序。你可以在这里找到示例代码:To prevent a memory leak, the JDBC Driver has been forcibly unregistered
您还应该考虑将 JDBC 驱动程序放在 TOMCAT_HOME/lib 文件夹中,而不是在您的 WAR 中提供它,这样驱动程序只加载一次,而不是在每次重新部署时加载一次,并且为每个 Web 应用程序加载一次。
单击 Tomcat 管理器中的“查找泄漏”按钮后收到的消息有点误导。此消息仅表明之前部署的实例中的一些类仍在加载,而垃圾收集器尚未卸载它们,但可能稍后会卸载它们。
我最近回答了一个类似的问题,并解释了如何在与 tomcat 相关的 Web 应用程序中查找内存泄漏:Tomcat memory Leak
【讨论】:
以上是关于内存泄漏 - Tomcat、Spring MVC的主要内容,如果未能解决你的问题,请参考以下文章