tomcat 優化

Tomcat啓動行參數的優化:
JDK版本1.8,tomcat 9.0.12
Tomcat 的啓動參數位於tomcat的安裝目錄\bin目錄下,Linux操作系統就是catalina.sh文件,Windows操作系統就是catalina.bat文件。打開該文件,在該文件頭部註釋(linux用#來註釋,windows用rem來註釋)結束的地方的下一行加上如下信息:
linux:

JAVA_OPTS="-server -Xms1g -Xmx1g -Xmn500m -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

windows下:

set JAVA_OPTS="-server  -Xms1g -Xmx1g -Xmn500m -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"

上面參數後的值是需要根據自己的實際情況來設置
-server
只要tomcat是運行在生產環境中的,這個參數必須加上
tomcat默認是以 –client的模式來運行的,server即意味着你的tomcat是以真實的production的模式在運行的,這也就意味着tomcat以server模式運行時將擁有:更大、更高的併發處理能力,更快更強捷的JVM垃圾回收機制,可以獲得更多的負載與吞吐量。。。

-Xms–Xmx
即JVM內存設置了,把Xms與Xmx兩個值設成一樣是最優的做法,
可以使用如下命令查看JVM所支持的最大內存:java -Xms4096m -version

java -Xms40960m -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

說明可以支持 40960m這麼大的內存,當然你可以改的更大,只要運行不出錯就行。在設這個-Xms與-Xmx值時記得要先這樣測試一下,要不值過大,tomcat就起不來。

–Xmn

設置年輕代大小爲512m。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小爲64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。

-Xss

是指設定每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256K,這個要根據應用的線程所需內存大小進行調整.在相同物理內存下,減小這個值能生成更多的線程.但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。一般小的應用,如果棧不是很深, 128k應該夠用的,大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。和threadstacksize選項解釋很類似,官方文檔似乎沒有解釋,在論壇中有這樣一句話:“-Xss is translated in a VM flag named ThreadStackSize”,一般設置這個值就可以了。一般不易設置超過1M,要不然容易出現OOM。

-XX:+AggressiveOpts

作用如其名(aggressive),啓用這個參數,則每當JDK版本升級時,你的JVM都會使用最新加入的優化技術(如果有的話)

-XX:+UseBiasedLocking

啓用一個優化了的線程鎖,我們知道在我們的appserver,每個http請求就是一個線程,有的請求短有的請求長,就會有請求排隊的現象,甚至還會出現線程阻塞,這個優化了的線程鎖使得你的appserver內對線程處理自動進行最優調配。

-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M
JDK1.8之前是 -XX:PermSize=128M -XX:MaxPermSize=256M

-XX:+DisableExplicitGC
在程序代碼中不允許有顯示的調用”System.gc()”。

-XX:+UseParNewGC
對年輕代採用多線程並行回收,這樣收得快。

-XX:+UseConcMarkSweepGC
即CMS gc,這一特性只有jdk1.5即後續版本才具有的功能,它使用的是gc估算觸發和heap佔用觸發。

-XX:MaxTenuringThreshold
設置垃圾最大年齡。如果設置爲0的話,則年輕代對象不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置爲一個較大值,則年輕代對象會在Survivor區進行多次複製,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概率。這個值的設置是根據本地的jprofiler監控後得到的一個理想的值。

-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC 的情況下, 儘量減少 mark 的時間。

-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情況下, 防止 memoryfragmention, 對live object 進行整理, 使 memory 碎片減少。

-XX:LargePageSizeInBytes
指定 Java heap的分頁頁面大小

-XX:+UseFastAccessorMethods
get,set 方法轉成本地代碼

-XX:+UseCMSInitiatingOccupancyOnly
指示只有在 oldgeneration 在使用了初始化的比例後concurrent collector 啓動收集

-XX:CMSInitiatingOccupancyFraction=70
CMSInitiatingOccupancyFraction,這個參數設置有很大技巧,基本上滿足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不會出現promotion failed。CMSInitiatingOccupancyFraction=70說明年老代到70%滿的時候開始執行對年老代的併發垃圾回收(CMS),這時還 剩30%的空間是(Xmx-Xmn)*30%兆,所以即使Xmn(也就是年輕代共512兆),只要滿 足上面的公式,就不會出現垃圾回收時的promotion failed;
因此這個參數的設置必須與Xmn關聯在一起。

-Djava.awt.headless=true
這個參數一般我們都是放在最後使用的,這全參數的作用是這樣的,有時我們會在我們的J2EE工程中使用一些圖表工具如:jfreechart,用於在web網頁輸出GIF/JPG等流,在winodws環境下,一般我們的app server在輸出圖形時不會碰到什麼問題,但是在linux/unix環境下經常會碰到一個exception導致你在winodws開發環境下圖片顯示的好好可是在linux/unix下卻顯示不出來,因此加上這個參數以免避這樣的情況出現。

16G內存 JDK8 生產服務器配置未驗證,先丟完整配置
JAVA_OPTS=”-server -Xmx4g -Xms4g -Xmn256m -Xss512k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Duser.timezone=GMT+8”

-server//服務器模式
-Xmx4g //JVM最大允許分配的堆內存,按需分配
-Xms4g //JVM初始分配的堆內存,一般和Xmx配置成一樣以避免每次gc後JVM重新分配內存。
-Xmn256m //年輕代內存大小,整個JVM內存=年輕代 + 年老代 + 持久代
-Xss512k //設置每個線程的堆棧大小
-XX:+DisableExplicitGC //忽略手動調用GC, System.gc()的調用就會變成一個空調用,完全不觸發GC
-XX:+UseConcMarkSweepGC //併發標記清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled //降低標記停頓
-XX:LargePageSizeInBytes=128m //內存頁的大小
-XX:+UseFastAccessorMethods //原始類型的快速優化
-XX:+UseCMSInitiatingOccupancyOnly //使用手動定義初始化定義開始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 //使用cms作爲垃圾回收使用70%後開始CMS收集
-Duser.timezone=GMT+8 //設定GMT區域,避免CentOS坑爹的時區設置

參考http://developer.51cto.com/art/201507/486162.htm

根據運行環境去掉了
-XX:PermSize
-XX:+UseCMSCompactAtFullCollection

Tomcat容器內的優化
打開tomcat安裝目錄\conf\server.xml文件,定位到這一行:

<Connector port="8080" protocol="HTTP/1.1"

這一行就是我們的tomcat容器性能參數設置的地方,它一般都會有一個默認值,這些默認值是遠遠不夠我們的使用的,我們來看經過更改後的這一段的配置:

<Connector port="8080" protocol="HTTP/1.1"
          URIEncoding="UTF-8"   minSpareThreads="25"  maxSpareThreads="75"
          enableLookups="false"  disableUploadTimeout="true"  connectionTimeout="20000"
          acceptCount="300"   maxThreads="300"  maxProcessors="1000"  minProcessors="5"
          useURIValidationHack="false"   compression="on" compressionMinSize="2048"
          compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
          redirectPort="8443"
/>

URIEncoding=”UTF-8”
使得tomcat可以解析含有中文名的文件的url

maxSpareThreads
maxSpareThreads 的意思就是如果空閒狀態的線程數多於設置的數目,則將這些線程中止,減少這個池中的線程總數。

minSpareThreads
最小備用線程數,tomcat啓動時的初始化的線程數。

enableLookups
爲了消除DNS查詢對性能的影響我們可以關閉(false)DNS查詢,方式是修改server.xml文件中的enableLookups參數值。

connectionTimeout
connectionTimeout爲網絡連接超時時間毫秒數。

maxThreads
maxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數,即最大併發數。

acceptCount
acceptCount是當線程數達到maxThreads後,後續請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,如果這個隊列也滿了,就直接refuse connection

maxProcessors與minProcessors
在 Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閒時間保持最低,從而接受更多的請求。
通常Windows是1000個左右,Linux是2000個左右。

useURIValidationHack
把useURIValidationHack設成”false”,可以減少它對一些url的不必要的檢查從而減省開銷。

給Tomcat配置gzip壓縮(HTTP壓縮)功能

compression="on" compressionMinSize="2048"             
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從服務器端將網頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節省40%左右的流量。更爲重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮。
1)compression=”on” 打開壓縮功能
2)compressionMinSize=”2048” 啓用壓縮的輸出內容大小,這裏面默認爲2KB
3)noCompressionUserAgents=”gozilla, traviata” 對於以下的瀏覽器,不啓用壓縮
4)compressableMimeType=”text/html,text/xml” 壓縮類型

如果使用https協議的話,需要作同樣的配置。

參考:https://blog.csdn.net/u011381576/article/details/79635867
https://blog.csdn.net/lifetragedy/article/details/7708724
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

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