赞
踩
运行环境如下:
项目 | 版本 |
---|---|
JDK | 1.8 |
Tomcat | 9.0.73 |
IDEA | 2023.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]的线程,但未能停止它。这很可能会造成内存泄漏
从网上看了大量的该问题的解决方案,有许多是行不通的。例如博文解决SSM项目关闭Tomcat9时出现Web应用程序注册了JDBC驱动程序,但在Web应用程序停止时无法注销销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册的问题给出的方案,但是在我的环境下,找不到类com.mysql.cj.jdbc.AbandonedConnectionCleanupThread
。
还有的说是Tomcat的版本问题,需要改为低版本;stackoverflow也给出了一些解决方案,但场景也不能适用。
最后,找到一篇博文Tomcat停止时为了防止内存泄漏,JDBC驱动程序被强制取消注册出现原因,我采用了其中方法2解决了该问题。
具体说,该解决方法步骤如下:
1 打开项目的Project Structure
,按下图设置一下:
上图中,需要右击4,才能出现5。
我反复启动服务、关闭服务,都没有发现问题。截图如下:
可以看出,已不再出现前述的警告信息了。
真正的原因我还是不知道,stackoverflow虽有人给出了问题的原因,但我还是没理解透。稀里糊涂的把问题解决了,记录一下。
之前在带GPU的电脑上安装了多次Tensorflow 2.x,安装过程非常繁琐,但都没有像本问题那样令人困惑。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。