系統環境:jdk1.8,apache-tomcat-8.5.35 一、jvm優化 進入 bin/catalina.sh,修改JAVA_OPTS配置: JAVA_OPTS="-server -Xms8192M -Xmx8192M -XX:NewRatio=4 -XX:SurvivorRatio=8 - ...
系統環境:jdk1.8,apache-tomcat-8.5.35
一、jvm優化
進入 bin/catalina.sh,修改JAVA_OPTS配置:
JAVA_OPTS="-server -Xms8192M -Xmx8192M -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/javamemorylogs/dump -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/javamemorylogs/gclog -XX:+DisableExplicitGC"
各參數含義: (1)-server:表示這是應用於伺服器的配置,JVM 內部會有特殊處理的 。 (2)-Xms8192m:設置JVM最小記憶體。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配記憶體。 (3)-Xmx8192m:設置JVM最大可用記憶體。 (4):-XX:NewRatio=4:設置年輕代(包括 Eden 和兩個 Survivor 區)與終身代的比值(除去永久代)。設置為 4,則年輕代與終身代所占比值為 1:4,年輕代占整個堆棧的 1/5 。 (4)-XX:SurvivorRatio=8:年輕代中Eden區與兩個Survivor區的比值。註意Survivor區有兩個。如:8,表示Eden:Survivor=8:2,一個Survivor區占整個年輕代的1/10。 (5)-XX:+UseConcMarkSweepGC:CMS收集,設置年老代為併發收集。它的主要適合場景是對響應時間的重要性需求大於對吞吐量的需求,能夠承受垃圾回收線程和應用線程共用CPU資源,並且應用中存在比較多的長生命周期對象。CMS收集的目標是儘量減少應用的暫停時間,減少Full GC發生的幾率,利用和應用程式線程併發的垃圾回收線程來標記清除年老代記憶體。 (6)-XX:ParallelGCThreads=8:表示JVM在進行並行GC的時候,用於GC的線程數。 (7)-XX:+HeapDumpOnOutOfMemoryError:可以讓JVM在出現記憶體溢出時候Dump出當前的記憶體轉儲快照。 (8)XX:HeapDumpPath:生成DUMP文件的路徑,如不設置,預設存儲在jvm 運行環境目錄。 (9)-XX:+PrintGCDetails:列印GC詳細信息。 (10)-XX:+PrintGCDateStamps:記錄GC日誌並不會特別地影響Java程式性能,推薦你儘可能記錄日誌。 (11)-Xloggc:指定GC log的位置,以文件輸出。幫助開發人員分析問題。 (12)-XX:+DisableExplicitGC:這個將會忽略手動調用 GC 的代碼使得 System.gc() 的調用就會變成一個空調用,完全不會觸發任何 GC。二、tomcat優化
1.修改conf/server.xml如下兩段配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="700" minSpareThreads="100" maxSpareThreads="400" prestartminSpareThreads = "true" maxQueueSize = "300"/> <Connector executor="tomcatThreadPool" port="80" protocol="org.apache.coyote.http11.Http11Nio2Protocol" acceptCount="500" connectionTimeout="20000" redirectPort="8443" compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" URIEncoding="utf-8" enableLookups="false" useURIValidationHack="false" maxConnections="1000" tcpNoDelay="true" /> 重點參數解釋: (1)maxThreads:最大併發數,預設設置 200,一般建議在 500 ~ 800,根據硬體設施和業務來判斷 (2)minSpareThreads:Tomcat 初始化時創建的線程數,預設設置 25 (3)prestartminSpareThreads:在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,如果不等於 true,minSpareThreads 的值就沒啥效果了 (4)maxQueueSize:最大的等待隊列數,超過則拒絕請求 (5)acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,預設設置 100 (6)maxConnections:伺服器在任何給定時間將接受和處理的最大連接數。當達到這個數字時,伺服器將接受,但不處理另一個連接。這個額外的連接將被阻塞,直到正在處理的連接數量低於maxConnections,此時伺服器將開始接受並再次處理新的連接。請註意,一旦達到限制,操作系統仍然可以接受基於acceptCount設置的連接。預設值因連接器類型而異。對於BIO,預設值是maxThreads的值,除非使用Executor,在這種情況下,預設值將是執行者的maxThreads的值。對於NIO和NIO2,預設值為10000.對於APR/native,預設值為8192。簡單來說就是nio使用maxConnections代替maxThreads。 (7)enableLookups:禁用DNS查詢2.關閉shutdown埠
shown埠是寫在Server參數里的,直接去掉是不管用,也是會預設啟動的,一般在安全設置時候建議把埠修改為其他埠,shutdown修改為其他複雜字串。實際上這個埠是可以直接屏蔽不監聽的。設置時候將其port值修改為-1即可: <Server port="-1" shutdown="SHUTDOWN">3、禁用tomcat Manager管理入口
為防止從tomcat web管理界面上傳文件,破壞運行環境,可以手動刪除tomcat自帶的管理界面。 進入tomcat預設頁面時有“server status”、“manager app”、“Host manager”。 如果修改conf/tomcat-users.xml,配置後: <role rolename="manager"/> <role rolename="manager-gui"/> <role rolename="admin"/> <user username="user" password="password" roles="admin,manager,manager-gui"/>訪問tomcat web頁面,用上面配置的用戶名密碼登錄將會出現如下界面,一旦用戶名密碼泄露或被攻擊,伺服器很容易被破壞。
Server Status
Manager App
Host Manager
避免如上界面入口引發問題,操作如下: 1、進入tomcat/webapps目錄 2、只保留manager,ROOT,以及項目相關文件,刪除其他包含docs、examples、host-manager文件(rm -rf 目錄名稱),如果怕出錯,請先備份要刪除的文件。重新啟動tomcat後,Tomcat Manager Web將如下:
Server Status
Manager App
Host Manager
恭喜!優化設置到此結束,趕緊嘗試一下吧!