Tomcat簡介與啟動加速【JVM調(diào)優(yōu)實戰(zhàn)】

個人博客原文:http://www.relaxheart.cn/to/master/blog?uuid=68

Tomcat服務(wù)器是一個免費的開源的Web應(yīng)用服務(wù)器。Tomcat是Apache軟件基金會的Jakarta項目中的一個核心項目,有Apache、Sun和其他一些公司及個人共同開發(fā)完成的。它完全基于Java平臺,也是目前使用最廣泛的Servlet容器之一。Tomcat安裝完成后,目錄結(jié)構(gòu)如下圖:


捕獲.PNG

bin目錄下存放的是Tomcat的啟動、關(guān)閉程序;
conf目錄下是Tomcat服務(wù)器的配置文件,包括Tomcat的權(quán)限管理、線程池、端口號等配置信息;
webapps下存放部署在Tomcat下的Web應(yīng)用,每個應(yīng)用對應(yīng)一個文件夾或者一個war包。

啟動Tomcat時,只要運行bin目錄下的startup.sh(linux下, windows下是startup.bat)文件即可。下面是我的機器tomcat啟動后的顯示信息,控制臺最后幾行輸出:

26-Mar-2019 22:17:08.238 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-80"]
26-Mar-2019 22:17:08.310 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["https-jsse-nio-443"]
26-Mar-2019 22:17:08.312 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
26-Mar-2019 22:17:08.314 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 146478 ms

日志里面第一行結(jié)尾“http-nio-80” 說明我是使用80端口啟動的,最后一行“startup in 146478ms”說明本次啟動耗時146478毫秒(時間是有點久啊,這個可能是和我的應(yīng)用復(fù)雜度有關(guān),當然另外一個原因也就是今天記錄的重點,Jvm調(diào)優(yōu) - Tomcat啟動加速)。

下面將開始學(xué)習(xí)如何通過配置合理的JVM參數(shù),來加快Tomcat的啟動速度。
我們在使用startup.sh腳本啟動Tomcat時,startup.sh調(diào)用了bin目錄下的catalina.sh(linux下, windows下是catalina.bat)腳本。如果需要配置Tomcat的JVM參數(shù),可以僵蠶數(shù)據(jù)寫入catalina.sh中。打開catalina.sh可以看到,在文件中有類似如下一段說明:

#  CATALINA_OPTS   (Optional) Java runtime options used when the "start",
#                   "run" or "debug" command is executed.
#                   Include here and not in JAVA_OPTS all options, that should
#                   only be used by Tomcat itself, not by the stop process,
#                   the version command etc.
#                   Examples are heap size, GC logging, JMX ports etc.
#
#    // 省略一部分
#
#   JAVA_OPTS       (Optional) Java runtime options used when any command
#                   is executed.
#                   Include here and not in CATALINA_OPTS all options, that
#                   should be used by Tomcat and also by the stop process,
#                   the version command etc.
#                   Most options should go into CATALINA_OPTS.

這段說明顯示,配置環(huán)境變量CATALINA_OPTS或者JAVA_OPTS都可以設(shè)置Tomcat的JVM優(yōu)化參數(shù)。就startup.sh而言,將參數(shù)配置在任何一個環(huán)境變量中都可以生效的。根據(jù)說明的建議,類似于堆大小、GC日志和JMX端口等推薦配置在CATALINA_OPTS中。為了獲取Tomcat啟動是的GC信息,可以在catalina.sh中加入:

set CATALINA_OPTS=-Xloggc:gc.log -XX:+PrintGCDetails

再次啟動Tomcat,發(fā)現(xiàn)在bin目錄下生成文件gc.log,記錄著啟動時的GC信息。在我的啟動過程中一共記錄32次GC,其中Full GC兩次。如果可以去掉這些GC過程,那么啟動速度無意會變快。注意這兩段Full GC的日志:

[Full GC (Ergonomics) [PSYoungGen: 1537K->1674K(4096K)] [ParOldGen: 7129K->7129K(7168K)] 8074K->8019K(9216K), [Metaspace: 3357K->3357K(1056768K)], 0.1213761 secs] [Times: user=0.03  sys=0.00, real=0.03 secs]

[Full GC (Ergonomics) [PSYoungGen: 944K->890K(2048K)] [ParOldGen: 7129K->7129K(7168K)] 8074K->8019K(9216K), [Metaspace: 3357K->3357K(1056768K)], 0.1213761 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]

在發(fā)生Full GC時,永久去回收了部分數(shù)據(jù),如果擁有一個較大的永久去,則可以避免發(fā)生Full GC。同時,為了減少Minor GC的次數(shù),也需要增大新生代。為此嘗試使用一下參數(shù)啟動Tomcat:

set CATALINA_OPTS=%CATALINA_OPTS% -Xmx32M -Xms32M

在運行Tomcat,啟動完成后查看日志。發(fā)現(xiàn)還有一次Full GC。這次Full GC是因為代碼中顯示使用了System.gc()導(dǎo)致的。因此,可以使用一下參數(shù),禁用顯示GC:

set CATALINA_OPTS=%CATALINA_OPTS%  -XX:+DisableExplicitGC

至此,在Tomcat的啟動過程中,已經(jīng)找不到了Full GC的蹤跡,同時Minor GC也較少到了14次。

在堆內(nèi)存32MB不變的前提下,為了能進一步減少Minor GC的次數(shù),可以擴大新生代的大小:

set CATALINA_OPTS=%CATALINA_OPTS%  -XX:NewRatio=2

在這個較大的新生代下,Minor GC的刺手較少到了2次,并且沒有Full GC發(fā)生,為了加快Minor GC的速度,在多核計算機上可以考慮使用新生代并行回收收集器,加快僅有的2次Minor GC的速度:

set CATALINA_OPTS=%CATALINA_OPTS%  -XX:+UserParallelGC

由于JVM在加載類時,處于安全考慮,會對class進行校驗和認證,如果類文件是可信的,為了加快程序的運行速度,也可以考慮禁用這些校驗:

set CATALINA_OPTS=%CATALINA_OPTS%  -Xverify:none

至此,完成了一個簡單的加快Tomcat啟動過程的實驗。再次啟動Tomcat服務(wù)器,在站長的計算機(騰訊云主機)上最后機上的輸出如下:

26-Mar-2019 23:26:04.282 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-80"]
26-Mar-2019 23:26:04.312 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["https-jsse-nio-443"]
26-Mar-2019 23:26:04.323 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
26-Mar-2019 23:26:04.342 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 21994 ms

到這里就結(jié)束了,但是這篇文件中對于Tomcat啟動加速,JVM調(diào)優(yōu)只用到了一小部分優(yōu)化配置方法,還有很多的優(yōu)化配置,關(guān)于CATALINA_OPTS 與 JAVA_OPTS的,感興趣的朋友去多多試一試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容