下載官方的tomcat,我這里用的是TOMCAT 8.5.46,然后解壓出來,解壓后的目錄如下圖
一、server.xml配置優化
進入conf目錄,打開server.xml 文件
1. 找到 <Executor name="tomcatThreadPool" .../>,將其修改如下
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="80" maxQueueSize="100" maxIdleTime="60000" prestartminSpareThreads="true" />
maxThreads:最大並發數,默認設置 200,一般建議在 500 ~ 800,根據硬件設施和業務來判斷
minSpareThreads:Tomcat 初始化時創建的線程數,默認設置 25
maxQueueSize:最大的等待隊列數,超過則拒絕請求
maxIdleTime:如果當前線程大於初始化線程,那空閑線程存活的時間,單位毫秒,默認60000=60秒=1分鍾。
prestartminSpareThreads:在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,如果不等於 true,minSpareThreads 的值就沒啥效果了
2.找到 <Connector port="8080" .../>,將其修改如下
<Connector executor="tomcatThreadPool" port="80" redirectPort="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" maxConnections="10000" enableLookups="false" acceptCount="100" maxPostSize="10485760" maxHttpHeaderSize="65536" compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" processorCache="20000" tcpNoDelay="true" connectionLinger="5" URIEncoding="utf-8" server="Server Version 11.0" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" />
protocol :TOMCAT8以上使用org.apache.coyote.http11.Http11Nio2Protocol,效率會更高,如果啟動是出現錯誤,請使用org.apache.coyote.http11.Http11NioProtocol。有可能是改了端口8005、8009導致。
connectionTimeout:Connector接受一個連接后等待的時間(milliseconds),默認值是60000。
maxConnections:這個值表示最多可以有多少個socket連接到tomcat上
enableLookups:禁用DNS查詢
acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值為100。
maxPostSize:設置由容器解析的URL參數的最大長度,-1(小於0)為禁用這個屬性,默認為2097152(2M) 請注意, FailedRequestFilter 過濾器可以用來拒絕達到了極限值的請求。
maxHttpHeaderSize:http請求頭信息的最大程度,超過此長度的部分不予處理。一般8K。
compression:是否啟用GZIP壓縮 on為啟用(文本數據壓縮) off為不啟用, force 壓縮所有數據
disableUploadTimeout:這個標志允許servlet容器使用一個不同的,通常長在數據上傳連接超時。 如果不指定,這個屬性被設置為true,表示禁用該時間超時。
compressionMinSize:當超過最小數據大小才進行壓縮
acceptorThreadCount:用於接受連接的線程數量。增加這個值在多CPU的機器上,盡管你永遠不會真正需要超過2。 也有很多非維持連接,您可能希望增加這個值。默認值是1。
processorCache:協議處理器緩存的處理器對象來提高性能。 該設置決定多少這些對象的緩存。-1意味着無限的,默認是200。 如果不使用Servlet 3.0異步處理,默認是使用一樣的maxThreads設置。 如果使用Servlet 3.0異步處理,默認是使用大maxThreads和預期的並發請求的最大數量(同步和異步)。
tcpNoDelay:如果設置為true,TCP_NO_DELAY選項將被設置在服務器套接字,而在大多數情況下提高性能。這是默認設置為true。
connectionLinger:秒數在這個連接器將持續使用的套接字時關閉。默認值是 -1,禁用socket 延遲時間。
URIEncoding:網站一般采用UTF-8作為默認編碼。
server:隱藏Tomcat版本信息,首先隱藏HTTP頭中的版本信息
compressableMimeType:配置想壓縮的數據類型
二、配置logging.properties文件
進入conf目錄,打開logging.properties文件,將所有encoding = UTF-8這行前面加上‘#’,將此行注釋掉,否則在運行tomcat時,控制台里的中文全部是亂碼,也可以將UTF-8改成GBK.
三、配置JVM
進入bin目錄,新建一個setevn.bat文件,然后用記事本打開,輸入下面的配置信息
SET JAVA_HOME=D:\Java\jdk1.8.0_221\jre
SET JAVA_OPTS=-server -Xms4096m -Xmx4096m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=12 -Xloggc:../logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+DisableExplicitGC
-server:表示這是應用於服務器的配置,JVM 內部會有特殊處理的
-Xms4096m:設置JVM最小內存為2048m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。
-Xmx4096m:設置JVM最大可用內存為2048MB
-Xmn2048m:設置JVM新生代大小(JDK1.4之后版本,此設置等同於 -XX:NewSize 和 -XX:MaxNewSize)。一般-Xmn的大小是-Xms的1/2左右,不要設置的過大或過小, 過大導致老年代變小,頻繁Full GC,過小導致minor GC頻繁。如果不設置-Xmn,可以采用-XX:NewRatio=2來設置,也是一樣的效果
-XX:NewSize:設置新生代大小
-XX:MaxNewSize:設置最大的新生代大小
-XX:PermSize:設置永久代大小
-XX:MaxPermSize:設置最大永久代大小
-XX:SurvivorRatio:在年輕代中,from(Survivor1)、to(Survivor2)與Eden的比值,若-XX:SurvivorRatio=10,由於from、to內存大小相等,from 、to分別占Young Generation的空間的1/12,Eden占10/12;
-XX:NewRatio=4:設置年輕代(包括 Eden 和兩個 Survivor 區)與年老代的比值(除去永久代)。設置為 4,則年輕代與年老代所占比值為 1:4,年輕代占整個堆棧的 1/5; Xms=Xmx並且設置了Xmn的情況下,該參數不需要進行設置。
-XX:MaxTenuringThreshold=10:設置垃圾最大年齡,默認為:15。如果設置為 0 的話,則年輕代對象不經過 Survivor 區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在 Survivor 區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。需要注意的是,設置了 -XX:MaxTenuringThreshold,並不代表着,對象一定在年輕代存活10次才被晉升進入老年代,它只是一個最大值,事實上,存在一個動態計算機制,計算每次晉入老年代的閾值,取閾值和MaxTenuringThreshold中較小的一個為准。
-Xloggc:../logs/gc.log GC日志文件位置
-XX:+DisableExplicitGC:這個將會忽略手動調用 GC 的代碼使得 System.gc() 的調用就會變成一個空調用,完全不會觸發任何 GC
注:以上-Xms -Xmx -Xmn 是按照8G的服務器內存配置的,在實際配置中,需要使用者自行調試
判斷配置是否起作用,進入bin文件夾中,打開命令行窗口,輸入catalina.bat configtest,出現如下頁面即代表配置成功