tomcat虛擬路徑
創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供天峨網(wǎng)站建設(shè)、天峨做網(wǎng)站、天峨網(wǎng)站設(shè)計(jì)、天峨網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、天峨企業(yè)網(wǎng)站模板建站服務(wù),10多年天峨做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。 reloadable="true" crossContext="true">
----------------------------------------------------------------------------------------------------------
tomcat內(nèi)存參數(shù)
1.參數(shù)的含義
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
-vmargs 說(shuō)明后面是VM的參數(shù),所以后面的其實(shí)都是JVM的參數(shù)了
-Xms128m JVM初始分配的堆內(nèi)存
-Xmx512m JVM大允許分配的堆內(nèi)存,按需分配
-XX:PermSize=64M JVM初始分配的非堆內(nèi)存
-XX:MaxPermSize=128M JVM大允許分配的非堆內(nèi)存,按需分配
我們首先了解一下JVM內(nèi)存管理的機(jī)制,然后再解釋每個(gè)參數(shù)代表的含義。
1)堆(Heap)和非堆(Non-heap)內(nèi)存
按照官方的說(shuō)法:“Java 虛擬機(jī)具有一個(gè)堆,堆是運(yùn)行時(shí)數(shù)據(jù)區(qū)域,所有類(lèi)實(shí)例和數(shù)組的內(nèi)存均從此處分配。堆是在 Java 虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建的?!薄霸贘VM中堆之外的內(nèi)存稱(chēng)為非堆內(nèi)存(Non-heap memory)”。
可以看出JVM主要管理兩種類(lèi)型的內(nèi)存:堆和非堆。簡(jiǎn)單來(lái)說(shuō)堆就是Java代碼可及的內(nèi)存,是留給開(kāi)發(fā)人員使用的;非堆就是JVM留給自己用的,
所以方法區(qū)、JVM內(nèi)部處理或優(yōu)化所需的內(nèi)存(如JIT編譯后的代碼緩存)、每個(gè)類(lèi)結(jié)構(gòu)(如運(yùn)行時(shí)常數(shù)池、字段和方法數(shù)據(jù))以及方法和構(gòu)造方法的代碼都在非堆內(nèi)存中。
堆內(nèi)存分配
JVM初始分配的堆內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64;JVM大分配的堆內(nèi)存由-Xmx指定,默認(rèn)是物理內(nèi)存的1/4。默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的大限制;
空余堆內(nèi)存大于70%時(shí),JVM會(huì)減少堆直到-Xms的最小限制。因此服務(wù)器一般設(shè)置-Xms、-Xmx 相等以避免在每次GC 后調(diào)整堆的大小。
說(shuō)明:如果-Xmx 不指定或者指定偏小,應(yīng)用可能會(huì)導(dǎo)致java.lang.OutOfMemory錯(cuò)誤,此錯(cuò)誤來(lái)自JVM,不是Throwable的,無(wú)法用try...catch捕捉。
非堆內(nèi)存分配
JVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;由XX:MaxPermSize設(shè)置大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。(還有一說(shuō):MaxPermSize缺省值和-server -client選項(xiàng)相關(guān),
-server選項(xiàng)下默認(rèn)MaxPermSize為64m,-client選項(xiàng)下默認(rèn)MaxPermSize為32m。這個(gè)我沒(méi)有實(shí)驗(yàn)。)
上面錯(cuò)誤信息中的PermGen space的全稱(chēng)是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域。還沒(méi)有弄明白PermGen space是屬于非堆內(nèi)存,還是就是非堆內(nèi)存,但至少是屬于了。
XX:MaxPermSize設(shè)置過(guò)小會(huì)導(dǎo)致java.lang.OutOfMemoryError: PermGen space 就是內(nèi)存益出。
說(shuō)說(shuō)為什么會(huì)內(nèi)存益出:
(1)這一部分內(nèi)存用于存放Class和Meta的信息,Class在被 Load的時(shí)候被放入PermGen space區(qū)域,它和存放Instance的Heap區(qū)域不同。
(2)GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的APP會(huì)LOAD很多CLASS 的話,就很可能出現(xiàn)PermGen space錯(cuò)誤。
這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。
2)JVM內(nèi)存限制(大值)
首先JVM內(nèi)存限制于實(shí)際的大物理內(nèi)存,假設(shè)物理內(nèi)存無(wú)限大的話,JVM內(nèi)存的大值跟操作系統(tǒng)有很大的關(guān)系。簡(jiǎn)單的說(shuō)就32位處理器雖然可控內(nèi)存空間有4GB,但是具體的操作系統(tǒng)會(huì)給一個(gè)限制,
這個(gè)限制一般是2GB-3GB(一般來(lái)說(shuō)Windows系統(tǒng)下為1.5G-2G,Linux系統(tǒng)下為2G-3G),而64bit以上的處理器就不會(huì)有限制了。
2. 為什么有的機(jī)器我將-Xmx和-XX:MaxPermSize都設(shè)置為512M之后Eclipse可以啟動(dòng),而有些機(jī)器無(wú)法啟動(dòng)?
通過(guò)上面對(duì)JVM內(nèi)存管理的介紹我們已經(jīng)了解到JVM內(nèi)存包含兩種:堆內(nèi)存和非堆內(nèi)存,另外JVM大內(nèi)存首先取決于實(shí)際的物理內(nèi)存和操作系統(tǒng)。所以說(shuō)設(shè)置VM參數(shù)導(dǎo)致程序無(wú)法啟動(dòng)主要有以下幾種原因:
1) 參數(shù)中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的總和超過(guò)了JVM內(nèi)存的大限制,比如當(dāng)前操作系統(tǒng)大內(nèi)存限制,或者實(shí)際的物理內(nèi)存等等。說(shuō)到實(shí)際物理內(nèi)存這里需要說(shuō)明一點(diǎn)的是,
如果你的內(nèi)存是1024MB,但實(shí)際系統(tǒng)中用到的并不可能是1024MB,因?yàn)橛幸徊糠直挥布加昧恕?/p>
3. 為何將上面的參數(shù)寫(xiě)入到eclipse.ini文件Eclipse沒(méi)有執(zhí)行對(duì)應(yīng)的設(shè)置?
那為什么同樣的參數(shù)在快捷方式或者命令行中有效而在eclipse.ini文件中是無(wú)效的呢?這是因?yàn)槲覀儧](méi)有遵守eclipse.ini文件的設(shè)置規(guī)則:
參數(shù)形如“項(xiàng) 值”這種形式,中間有空格的需要換行書(shū)寫(xiě),如果值中有空格的需要用雙引號(hào)包括起來(lái)。比如我們使用-vm C:/Java/jre1.6.0/bin/javaw.exe參數(shù)設(shè)置虛擬機(jī),
在eclipse.ini文件中要寫(xiě)成這樣:
-vm
C:/Java/jre1.6.0/bin/javaw.exe
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
實(shí)際運(yùn)行的結(jié)果可以通過(guò)Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按鈕進(jìn)行查看。
另外需要說(shuō)明的是,Eclipse壓縮包中自帶的eclipse.ini文件內(nèi)容是這樣的:
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中–launcher.XXMaxPermSize(注意最前面是兩個(gè)連接線)跟-XX:MaxPermSize參數(shù)的含義基本是一樣的,我覺(jué)得唯一的區(qū)別就是前者是eclipse.exe啟動(dòng)的時(shí)候設(shè)置的參數(shù),
而后者是eclipse所使用的JVM中的參數(shù)。其實(shí)二者設(shè)置一個(gè)就可以了,所以這里可以把–launcher.XXMaxPermSize和下一行使用#注釋掉。
4. 其他的啟動(dòng)參數(shù)。 如果你有一個(gè)雙核的CPU,也許可以嘗試這個(gè)參數(shù):
-XX:+UseParallelGC
讓GC可以更快的執(zhí)行。(只是JDK 5里對(duì)GC新增加的參數(shù))
補(bǔ)充:
如果你的WEB APP下都用了大量的第三方j(luò)ar,其大小超過(guò)了服務(wù)器jvm默認(rèn)的大小,那么就會(huì)產(chǎn)生內(nèi)存益出問(wèn)題了。
解決方法: 設(shè)置MaxPermSize大小
可以在myelipse里選中相應(yīng)的服務(wù)器比如tomcat5,展開(kāi)里面的JDK子項(xiàng)頁(yè)面,來(lái)增加服務(wù)器啟動(dòng)的JVM參數(shù)設(shè)置:
-Xms128m
-Xmx256m
-XX:PermSize=128M
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m
或者手動(dòng)設(shè)置MaxPermSize大小,比如tomcat,
修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
-----------------------------------------------------------------------------------------------------
tomcat線程池配置(已優(yōu)化后的是下面結(jié)果)
connectionTimeout="20000" redirectPort="8443" maxThreads="600" acceptCount="300" /> 重要參數(shù)說(shuō)明: Tomcat的并發(fā)請(qǐng)求處理數(shù)量=maxThreads + acceptCount protocol:?jiǎn)⒂肁PR連接模式,提高異步IO處理性能。啟用配置請(qǐng)參考:《開(kāi)啟Tomcat APR運(yùn)行模式,優(yōu)化并發(fā)性能》 maxThreads:大能接受的請(qǐng)求數(shù),默認(rèn)為200 minSpareThreads:最少備用線程數(shù),默認(rèn)初始化,默認(rèn)為25 maxSpareThreads:最多備用線程數(shù),一旦創(chuàng)建的線程超過(guò)這個(gè)值,Tomcat就會(huì)關(guān)閉不再需要的socket線程 acceptCount:等待處理的請(qǐng)求隊(duì)列,默認(rèn)為100,超過(guò)隊(duì)列長(zhǎng)度,服務(wù)器則拒絕客戶端請(qǐng)求,直接返回403 maxIdleTime:如果一個(gè)線程在30秒以內(nèi)沒(méi)有活躍,則終止運(yùn)行并從線程池中移除。除非線程池?cái)?shù)量小于或等于minSpareThreads數(shù)量。默認(rèn)值是1分鐘 enableLookups:如果為true,調(diào)用request.getRemoteHost會(huì)執(zhí)行DNS反查,反向解析IP對(duì)應(yīng)的域名或主機(jī),效率較低,建議設(shè)為false。 其中最后兩個(gè)參數(shù)意義如下: maxThreads:tomcat起動(dòng)的大線程數(shù),即同時(shí)處理的任務(wù)個(gè)數(shù),默認(rèn)值為200 acceptCount:當(dāng)tomcat起動(dòng)的線程數(shù)達(dá)到大時(shí),接受排隊(duì)的請(qǐng)求個(gè)數(shù),默認(rèn)值為100 這兩個(gè)值如何起作用,請(qǐng)看下面三種情況 情況1:接受一個(gè)請(qǐng)求,此時(shí)tomcat起動(dòng)的線程數(shù)沒(méi)有到達(dá)maxThreads,tomcat會(huì)起動(dòng)一個(gè)線程來(lái)處理此請(qǐng)求。 情況2:接受一個(gè)請(qǐng)求,此時(shí)tomcat起動(dòng)的線程數(shù)已經(jīng)到達(dá)maxThreads,tomcat會(huì)把此請(qǐng)求放入等待隊(duì)列,等待空閑線程。 情況3:接受一個(gè)請(qǐng)求,此時(shí)tomcat起動(dòng)的線程數(shù)已經(jīng)到達(dá)maxThreads,等待隊(duì)列中的請(qǐng)求個(gè)數(shù)也達(dá)到了acceptCount,此時(shí)tomcat會(huì)直接拒絕此次請(qǐng)求,返回connection refused maxThreads如何配置 一般的服務(wù)器操作都包括量方面:1計(jì)算(主要消耗cpu),2等待(io、數(shù)據(jù)庫(kù)等) 第一種極端情況,如果我們的操作是純粹的計(jì)算,那么系統(tǒng)響應(yīng)時(shí)間的主要限制就是cpu的運(yùn)算能力,此時(shí)maxThreads應(yīng)該盡量設(shè)的小,降低同一時(shí)間內(nèi)爭(zhēng)搶cpu的線程個(gè)數(shù),可以提高計(jì)算效率,提高系統(tǒng)的整體處理能力。 第二種極端情況,如果我們的操作純粹是IO或者數(shù)據(jù)庫(kù),那么響應(yīng)時(shí)間的主要限制就變?yōu)榈却獠抠Y源,此時(shí)maxThreads應(yīng)該盡量設(shè)的大,這樣 才能提高同時(shí)處理請(qǐng)求的個(gè)數(shù),從而提高系統(tǒng)整體的處理能力。此情況下因?yàn)閠omcat同時(shí)處理的請(qǐng)求量會(huì)比較大,所以需要關(guān)注一下tomcat的虛擬機(jī)內(nèi) 存設(shè)置和linux的open file限制。 我在測(cè)試時(shí)遇到一個(gè)問(wèn)題,maxThreads我設(shè)置的比較大比如3000,當(dāng)服務(wù)的線程數(shù)大到一定程度時(shí),一般是2000出頭,單次請(qǐng)求的響應(yīng)時(shí)間就會(huì)急劇的增加, 百思不得其解這是為什么,四處尋求答案無(wú)果,最后我總結(jié)的原因可能是cpu在線程切換時(shí)消耗的時(shí)間隨著線程數(shù)量的增加越來(lái)越大, cpu把大多數(shù)時(shí)間都用來(lái)在這2000多個(gè)線程直接切換上了,當(dāng)然cpu就沒(méi)有時(shí)間來(lái)處理我們的程序了。 以前一直簡(jiǎn)單的認(rèn)為多線程=高效率。。其實(shí)多線程本身并不能提高cpu效率,線程過(guò)多反而會(huì)降低cpu效率。 當(dāng)cpu核心數(shù)<線程數(shù)時(shí),cpu就需要在多個(gè)線程直接來(lái)回切換,以保證每個(gè)線程都會(huì)獲得cpu時(shí)間,即通常我們說(shuō)的并發(fā)執(zhí)行。 所以maxThreads的配置絕對(duì)不是越大越好。 現(xiàn)實(shí)應(yīng)用中,我們的操作都會(huì)包含以上兩種類(lèi)型(計(jì)算、等待),所以maxThreads的配置并沒(méi)有一個(gè)最優(yōu)值,一定要根據(jù)具體情況來(lái)配置。 最好的做法是:在不斷測(cè)試的基礎(chǔ)上,不斷調(diào)整、優(yōu)化,才能得到最合理的配置。 acceptCount的配置,我一般是設(shè)置的跟maxThreads一樣大,這個(gè)值應(yīng)該是主要根據(jù)應(yīng)用的訪問(wèn)峰值與平均值來(lái)權(quán)衡配置的。 如果設(shè)的較小,可以保證接受的請(qǐng)求較快相應(yīng),但是超出的請(qǐng)求可能就直接被拒絕 如果設(shè)的較大,可能就會(huì)出現(xiàn)大量的請(qǐng)求超時(shí)的情況,因?yàn)槲覀兿到y(tǒng)的處理能力是一定的。 --------------------------------------------------------------------------------------------------- 關(guān)閉tomcat訪問(wèn)日志,注釋掉下面的就行 prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> 其他tomcat日志配置可參看:http://jingyan.baidu.com/article/36d6ed1f713b9d1bcf4883e1.html ----------------------------------------------------------------------------- 轉(zhuǎn)移、分割tomcat日志 1、yum install cronolog 2、修改conf/下的logging.properties 1catalina.org.apache.juli.FileHandler.level = FINE 1catalina.org.apache.juli.FileHandler.directory = /home/log/web 1catalina.org.apache.juli.FileHandler.prefix = catalina. 2localhost.org.apache.juli.FileHandler.level = FINE 2localhost.org.apache.juli.FileHandler.directory = /home/log/web 2localhost.org.apache.juli.FileHandler.prefix = localhost. 3manager.org.apache.juli.FileHandler.level = FINE 3manager.org.apache.juli.FileHandler.directory = /home/log/web 3manager.org.apache.juli.FileHandler.prefix = manager. 4host-manager.org.apache.juli.FileHandler.level = FINE 4host-manager.org.apache.juli.FileHandler.directory = /home/log/web 4host-manager.org.apache.juli.FileHandler.prefix = host-manager. 3、修改bin/下的catalina.sh if [ -z "$CATALINA_OUT" ] ; then CATALINA_OUT=/home/online/log/openapiroute/catalina.out fi org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/sbin/cronolog /home/online/log/openapiroute/catalina.%Y-%m-%d.out >> /dev/null & 另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章標(biāo)題:tomcat配置相關(guān)總結(jié)-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)URL:http://weahome.cn/article/dshioh.html