在開(kāi)發(fā)當(dāng)中,當(dāng)1個(gè)項(xiàng)目比較大時(shí),依賴的jar包通常比較多,我們都知道,在利用服務(wù)器啟動(dòng)時(shí),會(huì)將利用援用到的所有類通過(guò)ClassLoader順次全部加載到內(nèi)存當(dāng)中。Java的邏輯內(nèi)存模型大致分為堆內(nèi)存、棧內(nèi)存、靜態(tài)內(nèi)存區(qū),也稱持久區(qū),該區(qū)的內(nèi)存不會(huì)被GC回收。堆內(nèi)存用于存儲(chǔ)類的實(shí)例、數(shù)組等援用類型數(shù)據(jù),也就是用new生成的對(duì)象,都寄存在這里,棧內(nèi)存存儲(chǔ)局部變量(如:方法參數(shù)),靜態(tài)內(nèi)存區(qū)存儲(chǔ)常量、靜態(tài)變量、類元數(shù)據(jù)信息(方法、屬性等)。開(kāi)發(fā)當(dāng)中常遇到的3類內(nèi)存溢出異常:
修改Tomcat的內(nèi)存配置,打開(kāi)$TOMCAT_HOME/bin/catalina.sh文件(Windows系統(tǒng)是catalina.bat文件),大楖在250行左右,在JAVA_OPTS參數(shù)上添加內(nèi)存參數(shù)設(shè)置便可。完全的JVM參數(shù)設(shè)置以下所示:
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256 -Djava.awt.headless"
-server參數(shù):表示以服務(wù)模式啟動(dòng),啟動(dòng)速度會(huì)略微慢1點(diǎn),但性能會(huì)高很多。不加這個(gè)參數(shù),默許是以客戶端模式啟動(dòng)。
java.awt.headless=true參數(shù):與圖形操作有關(guān),適用于linux系統(tǒng)。如生成驗(yàn)證碼,含義是當(dāng)前使用的是無(wú)顯示器的服務(wù)器,利用中如果獲得系統(tǒng)顯示有關(guān)參數(shù)會(huì)拋異常,可通過(guò)jmap -heap proccess_id查看設(shè)置是不是成功。
主要配置Tomcat能處理的要求數(shù),1個(gè)進(jìn)程建議最多不要超過(guò)1000個(gè)線程,表面上看線程越多處理的要求越多,其實(shí)過(guò)量的線程會(huì)占用CPU在不同線程之間切換的資源,致使CPU在每一個(gè)線程上處理的時(shí)間片極期有限,反而會(huì)下降服務(wù)器的響應(yīng)性能。
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="100"
acceptCount="200"
maxIdleTime="30000"
enableLookups="false"
/>
Tomcat的并發(fā)要求處理數(shù)量=maxThreads + acceptCount
protocol:?jiǎn)⒂肁PR連接模式,提高異步IO處理性能。啟用配置請(qǐng)參考:《開(kāi)啟Tomcat APR運(yùn)行模式,優(yōu)化并發(fā)性能》
maxThreads:最大能接受的要求數(shù),默許為200
minSpareThreads:線程池最小活躍線程數(shù),默許為25
acceptCount:等待處理的要求隊(duì)列,默許為100,超過(guò)隊(duì)列長(zhǎng)度,服務(wù)器則謝絕客戶端要求,直接返回403
maxIdleTime:如果1個(gè)線程在30秒之內(nèi)沒(méi)有活躍,則終止運(yùn)行并從線程池中移除。除非線程池?cái)?shù)量小于或等于minSpareThreads數(shù)量。默許值是1分鐘
enableLookups:如果為true,調(diào)用request.getRemoteHost會(huì)履行DNS反查,反向解析IP對(duì)應(yīng)的域名或主機(jī),效力較低,建議設(shè)為false。
更多參數(shù)設(shè)置,請(qǐng)參考Tomcat官方文檔:http://tomcat.apache.org/tomcat⑻.0-doc/config/http.html
Tomcat默許沒(méi)有配置管理員帳戶的權(quán)限,如果要查看app的部署狀態(tài)、通過(guò)管理界面deploy或undeploy,則需要在tomcat-user.xml中配置具有管理權(quán)限登錄的用戶。
<role rolename="tomcat"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
Tomcat官網(wǎng)配置:http://tomcat.apache.org/tomcat⑻.0-doc/manager-howto.html