http://blog.csdn.net/wuliu_forever/article/details/52607177
優化內存,主要是在bin/catalina.bat/sh 配置文件中進行。linux上,在catalina.sh中添加:
JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"
其中:
? -server:啟用jdk的server版本。
? -Xms:虛擬機初始化時的最小堆內存。
? -Xmx:虛擬機可使用的最大堆內存。 #-Xms與-Xmx設成一樣的值,避免JVM因為頻繁的GC導致性能大起大落
? -XX:PermSize:設置非堆內存初始值,默認是物理內存的1/64。
? -XX:MaxNewSize:新生代占整個堆內存的最大值。
? -XX:MaxPermSize:Perm(俗稱方法區)占整個堆內存的最大值,也稱內存最大永久保留區域。
1)錯誤提示:java.lang.OutOfMemoryError:Java heap space
Tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,有可能導致系統無法運行。常見的問題是報Tomcat內存溢出錯誤,Outof Memory(系統內存不足)的異常,從而導致客戶端顯示500錯誤,一般調整Tomcat的-Xms和-Xmx即可解決問題,通常將-Xms和-Xmx設置成一樣,堆的最大值設置為物理可用內存的最大值的80%。
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% 作為堆大小。當增加處理器時,記得增加內存,因為分配可以并行進行,而垃圾收集不是并行的。
2、連接數優化:
優化連接數,主要是在conf/server.xml配置文件中進行修改。
2.1、優化線程數
找到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.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 查看每個用戶允許打開的最大文件數
3、Tomcat Connector三種運行模式(BIO, NIO, APR)
3.1、三種模式比較:
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.2、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"]