当前位置:   article > 正文

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

[mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.webappcla

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,安装过程非常繁琐,但都没有像本问题那样令人困惑。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/635558
推荐阅读
相关标签
  

闽ICP备14008679号