層級優化!(JAVA_OPTS參數和主要元素的優化)javascript
Tomcat大體元素架構:server--->service-->Engine-->Host-->Contextcss
Tomcat有可使用三種協議:HTTP,AJP,HTTPShtml
tomcat默認採用的BIO模型java
tomcat的運行模式有3種:bio,nio,apr(額外安裝),例如:web
protocol="org.apache.coyote.http11.Http11Nio2Protocol"apache
Tomcat各個元素裏面都有listener監聽器,由Service層的鏈接器connector經過線程池(Thread Pool)調用執行器(Executor),Connector的做用是接收鏈接請求,建立Request和Response對象用於和請求端交換數據;而後分配線程攜帶該request和response交給綁定的Engine來處理,最後把處理後的Request和Response返回給客戶端。windows
tomcat在啓動時,會將web項目中WEB-INF/web.xml和本身的conf/web.xml進行合併,而後在ContextConfig類下的configureContext()統一解析這些內容瀏覽器
因此,沒必要要的配置要刪除,以減小Tomcat解析成本。tomcat
像在conf/web.xml的DefaultServlet或JspServlet,jspmap,mime,歡迎頁面按需來配置。安全
在conf/server.xml的Listener監聽器中,VersionLoggerListener做用是顯示版本和JDK環境,能夠刪除;AprLifecycleListener做用:加載APR庫使用,這個配置僅當connector的protocol設置爲AJP/1.3時有用,若是非AJP/1.3,能夠刪除。
GlobalResourcesLifecycleListener做用於全局資源
GlobalNamingResources能夠定義全局資源,能夠看出,這個tomcat的默認配置是經過讀取$TOMCAT_HOME/ conf/tomcat-users.xml實現的。tomcat-user.xml用於定義tomcat管理頁面相關配置,若是不登陸管理界面能夠刪掉。
當tomcat須要集成到Apache服務器時才使用這個<connector protocol=」AJP/1.3」/>
Server元素的port監聽關閉服務的請求
port:指定服務器端要建立的端口號,並在這個斷口監聽來自客戶端的請求
minProcessors:服務器啓動時建立的處理請求的線程數
maxProcessors:最大能夠建立的處理請求的線程數
enableLookups:若是爲true,則能夠經過調用request.getRemoteHost()進行DNS查詢來獲得遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址
redirectPort:指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號
acceptCount:指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理
maxConnections:達到這個值以後,將繼續接受鏈接,可是不處理,能繼續接受多少根據acceptCount的值
minSpareThreads:最小空閒線程數
connectionTimeout:指定超時的時間數(以毫秒爲單位)
tomcat默認鏈接池有限制,能夠爲connector配置本身的鏈接池,例如:
<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"
tomcat是用Java寫的,就要運行在jvm上,垃圾處理方式等都要遵循jvm的方式。tomcat中設置jvm參數在 catalina.sh(Linux)和catalina.bat(windows)中,以JAVA_OPTS變量存儲。
各參數詳解:
-Xms:設置JVM初始內存大小(默認是物理內存的1/64)
-Xmx:設置JVM可使用的最大內存(默認是物理內存的1/4,建議:物理內存80%)
-Xmn:設置JVM最小內存(128-256m就夠了,通常不設置)
-XX:PermSize :爲JVM啓動時Perm的內存大小
-XX:MaxPermSize :爲最大可佔用的Perm內存大小(默認爲32M)
-XX:MaxNewSize,默認爲16M
-XX:NewSize :默認爲2M,此值設大可調大新對象區,減小Full
GC次數
-XX:NewRatio :改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認爲8)
-XX:SurvivorRatio :改變Eden對象空間和殘存空間的尺寸比例,意思是Eden對象空
間的尺寸比殘存空間大survivorRatio+2倍(缺省值是10)
-XX:userParNewGC 可用來設置並行收集【多CPU】
-XX:ParallelGCThreads 可用來增長並行度【多CPU】
-XXUseParallelGC 設置後可使用並行清除收集器【多CPU】
<!--鏈接池設置-->
<Executor
name="tomcatThreadPool" --線程池名
namePrefix="catalina-exec-" --線程名稱前綴 namePrefix+threaNumber
maxThreads="1000" --池中最大線程數
minSpareThreads="100" --活躍線程數 會一直存在
maxIdleTime="60000" --線程空閒時間,超過該時間,線程會被銷燬 ms
maxQueueSize="Integer.MAX_VALUE" --被執行前線程的排隊數目
prestartminSpareThreads="false" --啓動線程池時,是否啓用minSpareThreads部分線程
threadPriority="5" --線程池中線程優先級 1~10
className="org.apache.catalina.core.StandardThreadExecutor" --線程實現類 自定義線程需時間 org.apache.catalina.Executor類
/>
<!--當配置了鏈接池時,須要配置該鏈接器-->
<Connector
executor="tomcatThreadPool" --線程池名
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol" --協議類型
disableUploadTimeout="true"
keepAliveTimeout="20000"
connectionTimeout="20000" --已接受,但未被處理的請求的等待超時時間 ms
redirectPort="8443" --安全通訊的轉發端口
URIEncoding="UTF-8"--URL編碼字符集
minSpareThreads="100" --默認初始化和保持空閒的線程數
enableLookups="false"--關閉DNS反向查詢
useURIValidationHack="false" --關閉沒必要要的檢查
maxThreads="1000" --處理請求線程的最大數目 未配置爲200 此屬性會被忽略
acceptCount="1000" --所用可能的線程都在使用時傳入鏈接請求的最大長度
disableUploadTimeout="true" --設置容許更長的超時鏈接
maxConnections="1000"--接受和處理的最大鏈接數(nio/nio2 1000,apr 8192)
maxHttpHeaderSize="8192"--請求和響應http頭的最大大小 8k
tcpNoDelay="true" --tcp不延遲
compression="on"--是否啓用壓縮 on off force
compressionMinSize="2048" --壓縮前數據最小值 2k byte
noCompressionUserAgents="gozilla,traviata" --設置哪些瀏覽器不壓縮
compressableMimeType="text/html,text/xml,text/css,application/javascript,text/plain" --設置壓縮的文件類型
/>
set JAVA_OPTS=
-server
-Xms1000M
-Xmx1000M #-Xms與-Xmx設成同樣的值,避免JVM由於頻繁的GC致使性能大起大落
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:+DisableExplicitGC
-XX:MaxTenuringThreshold=15
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true
telnet localhost 8005 而後輸入 SHUTDOWN 就能夠關閉 Tomcat,爲了安全咱們要禁用該功能
默認值:
<Server port="8005" shutdown="SHUTDOWN">
修改成:
<Server port="-1" shutdown="SHUTDOWN">---------------------