问题“Web应用程序[ROOT]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏”的解决

1 问题描述

运行环境如下:

项目版本
JDK1.8
Tomcat9.0.73
IDEA2023.3.2

写了一个SSM Java Web 项目,项目能正常运行,但是在关闭项目时(亦即在IDEA中通过按钮关闭Tomcat 9.0.73服务时),如下了如下警告:

D:\Server\apache-tomcat-9.0.73-windows-x64\apache-tomcat-9.0.73\bin\catalina.bat stop
Using CATALINA_BASE: “C:\Users\Abc\AppData\Local\JetBrains\IntelliJIdea2023.3\tomcat\be4e23eb-1dde-42b0-9e52-853b5050e770”
Using CATALINA_HOME: “D:\Server\apache-tomcat-9.0.73-windows-x64\apache-tomcat-9.0.73”
Using CATALINA_TMPDIR: “D:\Server\apache-tomcat-9.0.73-windows-x64\apache-tomcat-9.0.73\temp”
Using JRE_HOME: “D:\programfiles\BaseTools\Java\jdk-1.8”
Using CLASSPATH: “D:\Server\apache-tomcat-9.0.73-windows-x64\apache-tomcat-9.0.73\bin\bootstrap.jar;D:\Server\apache-tomcat-9.0.73-windows-x64\apache-tomcat-9.0.73\bin\tomcat-juli.jar”
Using CATALINA_OPTS: “”
14-Mar-2024 08:32:34.599 信息 [main] org.apache.catalina.core.StandardServer.await 通过关闭端口接收到有效的关闭命令。正在停止服务器实例。
14-Mar-2024 08:32:34.600 信息 [main] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler[“http-nio-8080”]
14-Mar-2024 08:32:34.686 信息 [main] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina]
14-Mar-2024 08:32:34.694 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [ROOT] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
14-Mar-2024 08:32:34.695 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [ROOT] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
14-Mar-2024 08:32:34.695 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[ROOT]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:91)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)]
INFO 03-14 08:32:34, 689 {dataSource-1} closing … (DruidDataSource.java:2071)
INFO 03-14 08:32:34, 691 {dataSource-1} closed (DruidDataSource.java:2144)
14-Mar-2024 08:32:34.705 信息 [main] org.apache.coyote.AbstractProtocol.stop 正在停止ProtocolHandler [“http-nio-8080”]
14-Mar-2024 08:32:34.715 信息 [main] org.apache.coyote.AbstractProtocol.destroy 正在摧毁协议处理器 [“http-nio-8080”]
Disconnected from server

上面问题的重点是:

Web应用程序 [ROOT] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
14-Mar-2024 08:32:34.695 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [ROOT] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
14-Mar-2024 08:32:34.695 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[ROOT]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏

2 解决

2.1 解决方法

从网上看了大量的该问题的解决方案,有许多是行不通的。例如博文解决SSM项目关闭Tomcat9时出现Web应用程序注册了JDBC驱动程序,但在Web应用程序停止时无法注销销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册的问题给出的方案,但是在我的环境下,找不到类com.mysql.cj.jdbc.AbandonedConnectionCleanupThread

还有的说是Tomcat的版本问题,需要改为低版本;stackoverflow也给出了一些解决方案,但场景也不能适用。

最后,找到一篇博文Tomcat停止时为了防止内存泄漏,JDBC驱动程序被强制取消注册出现原因,我采用了其中方法2解决了该问题。

具体说,该解决方法步骤如下:
1 打开项目的Project Structure,按下图设置一下:
在这里插入图片描述
上图中,需要右击4,才能出现5。

2.2 验证是否解决

我反复启动服务、关闭服务,都没有发现问题。截图如下:
在这里插入图片描述
可以看出,已不再出现前述的警告信息了。

3 结语

真正的原因我还是不知道,stackoverflow虽有人给出了问题的原因,但我还是没理解透。稀里糊涂的把问题解决了,记录一下。

之前在带GPU的电脑上安装了多次Tensorflow 2.x,安装过程非常繁琐,但都没有像本问题那样令人困惑。

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值