场景

        环境部署版本: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 JAVA_HOME=%~dp0java\jdk1.8.0_161

set JRE_HOME=%~dp0java\jdk1.8.0_161\jre

set CATALINA_HOME=%~dp0

SET PR_DISPLAYNAME=CVOS_TOMCAT

set JvmMs=2048

set JvmMx=2048

set JvmMs=2048 set JvmMx=2048(就是设置JVM内存大小)如果已经安装过服务需要先卸载(service.bat remove TOMCAT),重新安装(service.bat install TOMCAT)

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

 

问题)Tomcat服务启动:jsp页面返回404现象

02-Jun-2021 16:17:30.174 警告 [http-nio-8080-exec-14] org.apache.jasper.compiler.Compiler.removeGeneratedFiles 未能删除生成的Java文件[E:\Cloudvos\apache-tomcat-9.0.39-windows-x64\apache-tomcat-9.0.39\work\Catalina\localhost\cs\org\apache\jsp\WEB_002dINF\views\modules\ri\communityList_jsp.java]

解决

        文件权限导致的问题,删除所有的缓存文件

删除apache-tomcat-9.0.7\temp文件夹内容

删除apache-tomcat-9.0.7\work文件夹内容

 

知识储备

1)部署文件说明

tomcat9.exe 是 windows 服务的运行程序,相当于运行 startup.bat

tomcat9w.exe 是图形化界面程序,用于配置和监视 tomcat 的服务

service.bat是Tomcat服务安装的脚本(service install/remove tomcat)

catalina.bat是Tomcat启动的配置脚本

2)如何启动tomcat

1startup.bat

2D:\Cloudvos\WebServer\tomcat\apache-tomcat-9.0.7-windows-x64\apache-tomcat-9.0.7

\bin>D:\Cloudvos\WebServer\tomcat\apache-tomcat-9.0.7-windows-x64\apache-tomcat-

9.0.7\bin\tomcat9.exe //TS//CVOS_TOMCAT

命令行参数说明:每一个命令行参数都以//XX/ServiceName格式进行编写

可供执行的命令行

//TS// 以控制台方式启动服务

//RS// 只能被服务管理器调用运行

//SS//停止服务

//US//升级服务

//IS//安装服务

//DS//删除服务

3)JVM虚拟机的内存配置(默认情况下,最小是256m,最大是512m,在大项目中,内存不够用)

  1. startup.bat脚本启动的Tomcat,可以在catalina.bat开头添加set JAVA_OPTS=-server -Xms512m -Xmx2048m -Xss512k -XX:MaxNewSize=128m 

  2. 服务形式启动的无法通过上述的添加实现,因为服务启动的程序是tomcat9.exe,设置在catalina.bat中的配置不会生效,可以通过查看catalina.bat生成的日志文件可以查看

    解决方案:在service.bat文件中添加set JvmMs=2048 set JvmMx=2048,然后重新注册服务即可