Apache Tomcat 9:Windows服务启动失败排查过程

场景

        环境部署版本:apache-tomcat-9.0.7,由于该版本被安全扫描出漏洞,因此进行了升级,升级版本:apache-tomcat-9.0.39。Windows环境下手动执行startup.bat脚本启动正常,但是通过Windows服务形式启动,服务异常退出

日志分析

1catalina.2021-05-19.log

java.lang.OutOfMemoryError: Java heap space
at java.nio.HeapByteBuffer.(HeapByteBuffer.java:57)
at java.nio.ByteBuffer.allocate(ByteBuffer.java:335)
at org.apache.coyote.http11.Http11OutputBuffer.(Http11OutputBuffer.java:110)
at org.apache.coyote.http11.Http11Processor.(Http11Processor.java:163)
at org.apache.coyote.http11.AbstractHttp11Protocol.createProcessor(AbstractHttp11Protocol.java:1001)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
18-May-2021 16:25:55.990 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Xms128m
18-May-2021 16:25:55.990 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Xmx256m

内存设置太小

18-May-2021 17:19:58.841 信息 [Abandoned connection cleanup thread] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385)
at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1038)
at com.mysql.jdbc.AbandonedConnectionCleanupThread.checkContextClassLoaders(AbandonedConnectionCleanupThread.java:90)
at com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)


18-May-2021 17:19:51.643 信息 [Thread-43] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina]
18-May-2021 17:19:53.883 警告 [Thread-43] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [cs] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
18-May-2021 17:19:53.887 警告 [Thread-43] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [cs] 注册了JDBC驱动程序 [com.mysql.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
18-May-2021 17:19:53.889 警告 [Thread-43] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[cs]似乎启动了一个名为[Thread-6]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Thread.sleep(Native Method)
 com.cvos.cs.modules.map.camera.web.QueueListenter$1.run(QueueListenter.java:30)
 java.lang.Thread.run(Thread.java:748)]
18-May-2021 17:19:53.890 警告 [Thread-43] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[cs]似乎启动了一个名为[Abandoned connection cleanup thread]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:64)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 java.lang.Thread.run(Thread.java:748)]

 在不断重构代码的情况下,仍然不能解决内存溢出的问题(OutOfMemoryError等),这种情况下就需要使用JVM的配置参数对JVM运行时各个区域的内存情况进行相应的分配。

设置JVM中的内存

无效操作:

1)在catalina.bat文件开头添加 set JAVA_OPTS=-server -Xms2048m -Xmx2048m -Xss512k -XX:MaxNewSize=128m -Dfile.encoding=UTF-8,服务启动的过程中,仍然还是分配了256m内存

解决方案

                编辑servcie.bat文件,开头添加set JvmMs=2048 set JvmMx=2048,如果已经安装过服务需要先卸载(service.bat remove TOMCAT),重新安装(service install TOMCAT)

注意:管理员权限执行指令

上一篇:线程池


下一篇:Java并发编程-ThreadPool线程池