一、內存優化:java
優化內存,主要是在bin/catalina.bat或bin/catalina.sh 配置文件中進行。linux上,在catalina.sh中添加:linux
JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"
其中:web
• -server:啓用jdk的server版本。 • -Xms:虛擬機初始化時的最小堆內存。 • -Xmx:虛擬機可以使用的最大堆內存。 #-Xms與-Xmx設成同樣的值,避免JVM由於頻繁的GC致使性能大起大落 • -XX:PermSize:設置非堆內存初始值,默認是物理內存的1/64。 • -XX:MaxNewSize:新生代佔整個堆內存的最大值。 • -XX:MaxPermSize:Perm(俗稱方法區)佔整個堆內存的最大值,也稱內存最大永久保留區域。
1)錯誤提示:java.lang.OutOfMemoryError:Java heap spaceapache
Tomcat默承認以使用的內存爲128MB,在較大型的應用項目中,這點內存是不夠的,有可能致使系統沒法運行。常見的問題是報Tomcat內存溢出錯誤,Outof Memory(系統內存不足)的異常,從而致使客戶端顯示500錯誤,通常調整Tomcat的-Xms和-Xmx便可解決問題,一般將-Xms和-Xmx設置成同樣,堆的最大值設置爲物理可用內存的最大值的80%。tomcat
set JAVA_OPTS=-Xms512m-Xmx512m
2)錯誤提示:java.lang.OutOfMemoryError: PermGenspace服務器
PermGenspace的全稱是Permanent Generationspace,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGenspace中,它和存放類實例(Instance)的Heap區域不一樣,GC(Garbage Collection)不會在主程序運行期對PermGenspace進行清理,因此若是你的應用中有很CLASS的話,就極可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行precompile的時候。若是你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。解決方法:併發
setJAVA_OPTS=-XX:PermSize=128M
3)在使用-Xms和-Xmx調整tomcat的堆大小時,還須要考慮垃圾回收機制。若是系統花費不少的時間收集垃圾,請減少堆大小。一次徹底的垃圾收集應該不超過3-5 秒。若是垃圾收集成爲瓶頸,那麼須要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。通常說來,你應該使用物理內存的 80% 做爲堆大小。當增長處理器時,記得增長內存,由於分配能夠並行進行,而垃圾收集不是並行的。less
二、鏈接數優化:異步
#優化鏈接數,主要是在conf/server.xml配置文件中進行修改。jvm
2.一、優化線程數
找到Connectorport="8080" protocol="HTTP/1.1",增長maxThreads和acceptCount屬性(使acceptCount大於等於maxThreads),以下:
<Connectorport="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />
其中:
• maxThreads:tomcat可用於請求處理的最大線程數,默認是200 • minSpareThreads:tomcat初始線程數,即最小空閒線程數 • maxSpareThreads:tomcat最大空閒線程數,超過的會被關閉 • acceptCount:當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理.默認100
2.二、使用線程池
在server.xml中增長executor節點,而後配置connector的executor屬性,以下:
<Executorname="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/> <Connectorport="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
其中:
• namePrefix:線程池中線程的命名前綴 • maxThreads:線程池的最大線程數 • minSpareThreads:線程池的最小空閒線程數 • maxIdleTime:超過最小空閒線程數時,多的線程會等待這個時間長度,而後關閉 • threadPriority:線程優先級
注:當tomcat併發用戶量大的時候,單個jvm進程確實可能打開過多的文件句柄,這時會報java.net.SocketException:Too many open files錯誤。可以使用下面步驟檢查:
• ps -ef |grep tomcat 查看tomcat的進程ID,記錄ID號,假設進程ID爲10001 • lsof -p 10001|wc -l 查看當前進程id爲10001的 文件操做數 • 使用命令:ulimit -a 查看每一個用戶容許打開的最大文件數
三、Tomcat Connector三種運行模式(BIO, NIO, APR)
3.一、三種模式比較:
1)BIO:一個線程處理一個請求。缺點:併發量高時,線程數較多,浪費資源。Tomcat7或如下在Linux系統中默認使用這種方式。
2)NIO:利用Java的異步IO處理,能夠經過少許的線程處理大量的請求。Tomcat8在Linux系統中默認使用這種方式。Tomcat7必須修改Connector配置來啓動(conf/server.xml配置文件):
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>
3)APR(Apache Portable Runtime):從操做系統層面解決io阻塞問題。Linux若是安裝了apr和native,Tomcat直接啓動就支持apr。
3.二、apr模式
安裝apr以及tomcat-native
yum -y install apr apr-devel
進入tomcat/bin目錄,好比:
cd /opt/local/tomcat/bin/ tar xzfv tomcat-native.tar.gz cd tomcat-native-1.1.32-src/jni/native ./configure --with-apr=/usr/bin/apr-1-config make && make install
#注意最新版本的tomcat自帶tomcat-native.war.gz,不過其版本相對於yum安裝的apr太高,configure的時候會報錯。
解決:yum remove apr apr-devel –y,卸載yum安裝的apr和apr-devel,下載最新版本的apr源碼包,編譯安裝;或者下載低版本的tomcat-native編譯安裝
安裝成功後還須要對tomcat設置環境變量,方法是在catalina.sh文件中增長1行:
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
#apr下載地址:http://apr.apache.org/download.cgi
#tomcat-native下載地址:http://tomcat.apache.org/download-native.cgi
修改8080端對應的conf/server.xml
protocol="org.apache.coyote.http11.Http11AprProtocol"
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" />
PS:啓動之後查看日誌 顯示以下表示開啓 apr 模式
Sep 19, 2016 3:46:21 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-apr-8081"]
免費提供最新Linux技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/