内存泄漏 - 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的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 8 内存泄漏

Tomcat 停止线程以避免潜在的内存泄漏

在合理的时间范围内检测到一定程度内存泄漏的工具

Spring Boot引起的“堆外内存泄漏”排查及经验总结

Tomcat如何检测内存泄漏

Tomcat Guice/JDBC 内存泄漏