剛?cè)肼毿鹿镜腤eb服務(wù)器總是故障澄干,需要解決服務(wù)器的穩(wěn)定性來證明自己的能力砸烦。
首先查看Tomcat 7的日志文件中有OutOfMemoryError: PermGen space挣饥,即永久代(持久棧)內(nèi)存溢出惜姐。這個問題首先看TOMCAT的啟動參數(shù)病蛉,主要是以下兩個:
-Xmx:java heap最大值汽烦,使用的最大內(nèi)存
這里我設(shè)置為內(nèi)存減512M
-XX:MaxPermSize:設(shè)定最大內(nèi)存的永久保存區(qū)域
這里我設(shè)置為2048M(2G,一般不超過最大內(nèi)存的二分之一)
修改后重啟tomcat屹篓,第二天又內(nèi)存溢出了疙渣,肯定是代碼有問題。查找代碼后發(fā)現(xiàn)有4處代碼使用了數(shù)據(jù)庫連接之后抱虐,沒有關(guān)閉,導(dǎo)致內(nèi)存泄露饥脑。修復(fù)之代碼之后恳邀,然后發(fā)布懦冰。
沒過幾天又出問題了,對虛擬機(jī)內(nèi)存分析發(fā)現(xiàn)很多阻塞的線程谣沸,于是繼續(xù)優(yōu)化Tomcat的server.xml文件刷钢。網(wǎng)上流傳的文章,有些會誤導(dǎo)的乳附,參考了Tomcat官方文檔才得到正確的配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="10000"
keepAliveTimeout="60000"
acceptorThreadCount="4" maxCookieCount="600"
maxThreads="600" maxConnections="600"
minSpareThreads="100"
acceptCount="200"
redirectPort="8443" />
然后Tomcat就一直很穩(wěn)定了内地。connectionTimeout連接超時為10秒,acceptorThreadCount接受處理線程數(shù)為4(CPU的內(nèi)核數(shù))赋除,maxThreads最大線程數(shù)阱缓、maxCookieCount最大Cookie數(shù)、maxConnections最大連接數(shù)這三個值我都設(shè)置相同(最大連接數(shù)可以設(shè)置比線程數(shù)大一點(diǎn))举农,minSpareThreads最小空閑線程(即至少有多少個執(zhí)行線程處理等待狀態(tài)荆针,隨時可以處理任務(wù)),acceptCount(這個是當(dāng)超出最大線程之后的等待任務(wù)數(shù)量颁糟,之前網(wǎng)上有人說是線程總數(shù)量要大于等于最大線程數(shù)航背,我設(shè)置過大,導(dǎo)致產(chǎn)生了很多無用的等等線程棱貌,默認(rèn)值是100玖媚,其實(shí)也可以不用設(shè)置)