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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
 
 
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
  • 1.
  • 2.
 
 

內存設置太小

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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
 
 

 

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)]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
 
 

 在不斷重構代碼的情況下,仍然不能解決內存溢出的問題(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,然後重新註冊服務即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章