http://blog.csdn.net/wuliu_forever/article/details/52607177
優(yōu)化內(nèi)存,主要是在bin/catalina.bat/sh 配置文件中進(jìn)行张咳。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:?jiǎn)⒂胘dk的server版本虱饿。
? -Xms:虛擬機(jī)初始化時(shí)的最小堆內(nèi)存狈茉。
? -Xmx:虛擬機(jī)可使用的最大堆內(nèi)存恼策。 #-Xms與-Xmx設(shè)成一樣的值瞭稼,避免JVM因?yàn)轭l繁的GC導(dǎo)致性能大起大落
? -XX:PermSize:設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64咽块。
? -XX:MaxNewSize:新生代占整個(gè)堆內(nèi)存的最大值绘面。
? -XX:MaxPermSize:Perm(俗稱(chēng)方法區(qū))占整個(gè)堆內(nèi)存的最大值,也稱(chēng)內(nèi)存最大永久保留區(qū)域侈沪。
1)錯(cuò)誤提示:java.lang.OutOfMemoryError:Java heap space
Tomcat默認(rèn)可以使用的內(nèi)存為128MB揭璃,在較大型的應(yīng)用項(xiàng)目中,這點(diǎn)內(nèi)存是不夠的亭罪,有可能導(dǎo)致系統(tǒng)無(wú)法運(yùn)行瘦馍。常見(jiàn)的問(wèn)題是報(bào)Tomcat內(nèi)存溢出錯(cuò)誤,Outof Memory(系統(tǒng)內(nèi)存不足)的異常应役,從而導(dǎo)致客戶(hù)端顯示500錯(cuò)誤情组,一般調(diào)整Tomcat的-Xms和-Xmx即可解決問(wèn)題,通常將-Xms和-Xmx設(shè)置成一樣扛吞,堆的最大值設(shè)置為物理可用內(nèi)存的最大值的80%呻惕。
set JAVA_OPTS=-Xms512m-Xmx512m
2)錯(cuò)誤提示:java.lang.OutOfMemoryError: PermGenspace
PermGenspace的全稱(chēng)是Permanent Generationspace,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時(shí)就會(huì)被放到PermGenspace中滥比,它和存放類(lèi)實(shí)例(Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)PermGenspace進(jìn)行清理亚脆,所以如果你的應(yīng)用中有很CLASS的話(huà),就很可能出現(xiàn)PermGen space錯(cuò)誤,這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行precompile的時(shí)候盲泛。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小超過(guò)了jvm默認(rèn)的大小(4M)那么就會(huì)產(chǎn)生此錯(cuò)誤信息了濒持。解決方法:
setJAVA_OPTS=-XX:PermSize=128M
3)在使用-Xms和-Xmx調(diào)整tomcat的堆大小時(shí),還需要考慮垃圾回收機(jī)制寺滚。如果系統(tǒng)花費(fèi)很多的時(shí)間收集垃圾柑营,請(qǐng)減小堆大小。一次完全的垃圾收集應(yīng)該不超過(guò)3-5 秒村视。如果垃圾收集成為瓶頸官套,那么需要指定代的大小,檢查垃圾收集的詳細(xì)輸出蚁孔,研究垃圾收集參數(shù)對(duì)性能的影響奶赔。一般說(shuō)來(lái),你應(yīng)該使用物理內(nèi)存的 80% 作為堆大小杠氢。當(dāng)增加處理器時(shí)站刑,記得增加內(nèi)存,因?yàn)榉峙淇梢圆⑿羞M(jìn)行鼻百,而垃圾收集不是并行的绞旅。
2摆尝、連接數(shù)優(yōu)化:
優(yōu)化連接數(shù),主要是在conf/server.xml配置文件中進(jìn)行修改因悲。
2.1堕汞、優(yōu)化線(xiàn)程數(shù)
找到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可用于請(qǐng)求處理的最大線(xiàn)程數(shù)臼朗,默認(rèn)是200
? minSpareThreads:tomcat初始線(xiàn)程數(shù),即最小空閑線(xiàn)程數(shù)
? maxSpareThreads:tomcat最大空閑線(xiàn)程數(shù)蝎土,超過(guò)的會(huì)被關(guān)閉
? acceptCount:當(dāng)所有可以使用的處理請(qǐng)求的線(xiàn)程數(shù)都被使用時(shí)视哑,可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理.默認(rèn)100
2.2誊涯、使用線(xiàn)程池
在server.xml中增加executor節(jié)點(diǎn)挡毅,然后配置connector的executor屬性,如下:
<Executorname="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connectorport="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
其中:
? namePrefix:線(xiàn)程池中線(xiàn)程的命名前綴
? maxThreads:線(xiàn)程池的最大線(xiàn)程數(shù)
? minSpareThreads:線(xiàn)程池的最小空閑線(xiàn)程數(shù)
? maxIdleTime:超過(guò)最小空閑線(xiàn)程數(shù)時(shí)暴构,多的線(xiàn)程會(huì)等待這個(gè)時(shí)間長(zhǎng)度跪呈,然后關(guān)閉
? threadPriority:線(xiàn)程優(yōu)先級(jí)
注:當(dāng)tomcat并發(fā)用戶(hù)量大的時(shí)候,單個(gè)jvm進(jìn)程確實(shí)可能打開(kāi)過(guò)多的文件句柄取逾,這時(shí)會(huì)報(bào)java.net.SocketException:Too many open files錯(cuò)誤耗绿。可使用下面步驟檢查:
? ps -ef |grep tomcat 查看tomcat的進(jìn)程ID砾隅,記錄ID號(hào)误阻,假設(shè)進(jìn)程ID為10001
? lsof -p 10001|wc -l 查看當(dāng)前進(jìn)程id為10001的 文件操作數(shù)
? 使用命令:ulimit -a 查看每個(gè)用戶(hù)允許打開(kāi)的最大文件數(shù)
3、Tomcat Connector三種運(yùn)行模式(BIO, NIO, APR)
3.1晴埂、三種模式比較:
1)BIO:一個(gè)線(xiàn)程處理一個(gè)請(qǐng)求究反。缺點(diǎn):并發(fā)量高時(shí),線(xiàn)程數(shù)較多儒洛,浪費(fèi)資源精耐。Tomcat7或以下在Linux系統(tǒng)中默認(rèn)使用這種方式。
2)NIO:利用Java的異步IO處理琅锻,可以通過(guò)少量的線(xiàn)程處理大量的請(qǐng)求卦停。Tomcat8在Linux系統(tǒng)中默認(rèn)使用這種方式。Tomcat7必須修改Connector配置來(lái)啟動(dòng)(conf/server.xml配置文件):
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>
3)APR(Apache Portable Runtime):從操作系統(tǒng)層面解決io阻塞問(wèn)題恼蓬。Linux如果安裝了apr和native沫浆,Tomcat直接啟動(dòng)就支持apr。
3.2滚秩、apr模式
安裝apr以及tomcat-native
yum -y install apr apr-devel
進(jìn)入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淮捆,不過(guò)其版本相對(duì)于yum安裝的apr過(guò)高郁油,configure的時(shí)候會(huì)報(bào)錯(cuò)本股。
解決:yum remove apr apr-devel –y,卸載yum安裝的apr和apr-devel,下載最新版本的apr源碼包,編譯安裝;或者下載低版本的tomcat-native編譯安裝
安裝成功后還需要對(duì)tomcat設(shè)置環(huán)境變量桐腌,方法是在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端對(duì)應(yīng)的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:啟動(dòng)以后查看日志 顯示如下表示開(kāi)啟 apr 模式
Sep 19, 2016 3:46:21 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8081"]