系統環境:jdk1.8,apache-tomcat-8.5.35javascript
1、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"css
![](http://static.javashuo.com/static/loading.gif)
各參數含義:
(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。
2、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">
三、禁用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頁面,用上面配置的用戶名密碼登陸將會出現以下界面,一旦用戶名密碼泄露或被攻擊,服務器很容易被破壞。html
Server Statusjava
![](http://static.javashuo.com/static/loading.gif)
Manager Appweb
![](http://static.javashuo.com/static/loading.gif)
Host Managerapache
![](http://static.javashuo.com/static/loading.gif)
避免如上界面入口引起問題,操做以下:
一、進入tomcat/webapps目錄
二、只保留manager,ROOT,以及項目相關文件,刪除其餘包含docs、examples、host-manager文件(rm -rf 目錄名稱),
若是怕出錯,請先備份要刪除的文件。
從新啓動tomcat後,Tomcat Manager Web將以下:tomcat
Server Status安全
![](http://static.javashuo.com/static/loading.gif)
Manager App服務器
![](http://static.javashuo.com/static/loading.gif)
Host Manager併發
![](http://static.javashuo.com/static/loading.gif)
恭喜!優化設置到此結束,趕忙嘗試一下吧!