JAVA WEB系統(tǒng)性能調(diào)優(yōu)_第1頁(yè)
JAVA WEB系統(tǒng)性能調(diào)優(yōu)_第2頁(yè)
JAVA WEB系統(tǒng)性能調(diào)優(yōu)_第3頁(yè)
JAVA WEB系統(tǒng)性能調(diào)優(yōu)_第4頁(yè)
JAVA WEB系統(tǒng)性能調(diào)優(yōu)_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 JAVA WEB系統(tǒng)性能調(diào)優(yōu)JAVA WEB系統(tǒng)性能調(diào)優(yōu)V1.0廣州合道信息科技有限公司2014年3月² 文檔信息項(xiàng)目名: 項(xiàng)目編號(hào): 作者: 羅承偉創(chuàng)建日期: 2014-03-21使用者: 標(biāo)題: Javaweb 系統(tǒng)性能調(diào)優(yōu)方案分類(lèi): 部門(mén)名稱: 研發(fā)部版權(quán)聲明: ² 文檔狀態(tài)文檔狀態(tài)草稿正式文檔評(píng)審人員評(píng)審組組長(zhǎng):評(píng)審組成員: 評(píng)審時(shí)間² 修訂文檔歷史記錄日期版本說(shuō)明作者2014-03-21V1.0初稿羅承偉目錄1. 性能調(diào)優(yōu)流程41.1、確定調(diào)優(yōu)目標(biāo)41.2、測(cè)量系統(tǒng)性能51.3、分析性能瓶頸52. JVM性能調(diào)優(yōu)52.1、JVM內(nèi)存組成及分配62.1.

2、1、JAVA內(nèi)存組成介紹:堆(Heap)和非堆(Non-heap)內(nèi)存62.1.2、堆內(nèi)存分配62.1.3、非堆內(nèi)存分配72.1.4、JVM內(nèi)存限制(最大值)82.2、JVM參數(shù)詳解82.3、參數(shù)配置示例143. J2EE應(yīng)用監(jiān)控153.1、數(shù)據(jù)庫(kù)連接池監(jiān)控(Druid)153.1.1、Druid連接池配置153.1.2、Druid連接池監(jiān)控173.2、容器管理及監(jiān)控(psi-probe)183.2.1、Tomcat下安裝部署183.2.2、probe監(jiān)控界面223.3、JAVA虛擬機(jī)監(jiān)控(Visual VM)253.3.1、VisualVM安裝253.3.2、VisualVM簡(jiǎn)介253.3.

3、3、安裝插件263.3.4、監(jiān)控本地JAVA應(yīng)用273.3.5、監(jiān)控遠(yuǎn)程JAVA應(yīng)用283.3.6、使用Visual VM查看JVM相關(guān)信息313.3.7、使用Visual VM解決內(nèi)存溢出問(wèn)題333.3.8、使用Visual VM查看Tomcat的線程狀態(tài)343.3.8、使用Visual VM查看CPU消耗情況361. 性能調(diào)優(yōu)流程性能調(diào)優(yōu)無(wú)疑是個(gè)龐大且復(fù)雜的話題,也是項(xiàng)目中非常重要的一環(huán)。由于性能調(diào)優(yōu)涵蓋的面實(shí)在是太多了,我們僅看看性能調(diào)優(yōu)過(guò)程中常見(jiàn)的一些做法。1.1、確定調(diào)優(yōu)目標(biāo)性能調(diào)優(yōu),首先是要確定性能調(diào)優(yōu)的目標(biāo)是什么,如果現(xiàn)在應(yīng)用已經(jīng)滿足了需求,就沒(méi)必要去做性能調(diào)優(yōu)了,畢竟不經(jīng)過(guò)一個(gè)

4、系統(tǒng)的過(guò)程,其實(shí)是無(wú)法確定你所做的性能調(diào)整是否真的調(diào)優(yōu)了性能,是否沒(méi)有造成應(yīng)用中其他的問(wèn)題,所以確定性能目標(biāo)是非常重要的,在定義性能目標(biāo)的時(shí)候通常這么定義的呢:1 最大并發(fā)數(shù)2 Quality of Service 服務(wù)的質(zhì)量,在軟件系統(tǒng)方面我們認(rèn)為主要表現(xiàn)在請(qǐng)求的出錯(cuò)率,系統(tǒng)的load等。3 最長(zhǎng)響應(yīng)時(shí)間 對(duì)于任何請(qǐng)求所能承受的最大響應(yīng)時(shí)間。4 TPS 每秒需要支持的最大事務(wù)數(shù),最典型的指標(biāo)是:“某頁(yè)面最高需要支撐每秒3000次 的訪問(wèn)次數(shù)”。例如一個(gè)web系統(tǒng),需要定義出來(lái)的目標(biāo)是:并發(fā)目標(biāo):最高支撐200并發(fā);QoS:出錯(cuò)率須控制在萬(wàn)分之一,系統(tǒng)的load最高只能到達(dá)10;TPS:每秒完

5、成3000次請(qǐng)求的處理;最大響應(yīng)時(shí)間:最長(zhǎng)允許的響應(yīng)時(shí)間為5秒。至于請(qǐng)求的平均響應(yīng)時(shí)間這些就不在性能調(diào)優(yōu)目標(biāo)中定義,因?yàn)橐_(dá)到TPS的要求,響應(yīng)時(shí)間是必須要達(dá)到一個(gè)級(jí)別的,而且響應(yīng)時(shí)間隨著高并發(fā)是會(huì)出現(xiàn)劣化的。當(dāng)然,還可以把性能指標(biāo)定到更為細(xì)節(jié),例如某個(gè)方法的TPS在100并發(fā)時(shí)需要達(dá)到多少。在確定好了性能目標(biāo)后,重要的就是如何來(lái)測(cè)量系統(tǒng)的性能了。1.2、測(cè)量系統(tǒng)性能對(duì)于新系統(tǒng)而言,需要評(píng)估出其正式運(yùn)行時(shí)的數(shù)據(jù)量的增長(zhǎng)情況;而對(duì)于已運(yùn)行的系統(tǒng),則需要根據(jù)監(jiān)控獲取到系統(tǒng)的運(yùn)行數(shù)據(jù)(例如高峰并發(fā)數(shù)、系統(tǒng)的響應(yīng)速度情況、系統(tǒng)的load、網(wǎng)絡(luò)流量、每類(lèi)請(qǐng)求在總的請(qǐng)求中所占的百分比等)。新系統(tǒng)而言,要評(píng)

6、估出具體的性能相對(duì)來(lái)說(shuō)稍微好做一點(diǎn),因?yàn)榇藭r(shí)系統(tǒng)通常較為單純,數(shù)據(jù)量的增長(zhǎng)也不可能是一夜之間增長(zhǎng)的,因此基本可以按照一種正常的方法在測(cè)試環(huán)境評(píng)估出其正式運(yùn)行的性能。而對(duì)于已運(yùn)行的系統(tǒng)而言,則較為麻煩,因?yàn)橥ǔ?lái)講要在測(cè)試環(huán)境中模擬正式運(yùn)行環(huán)境基本是不太可能的,因此這個(gè)時(shí)候通常要采取一些模擬的方法或更高壓力的方法來(lái)盡量更為準(zhǔn)確的評(píng)估出系統(tǒng)的性能。在測(cè)試系統(tǒng)性能時(shí),通常可采用的方法有:1 單元測(cè)試 可借助單元測(cè)試來(lái)測(cè)試某個(gè)請(qǐng)求的性能2 壓力測(cè)試 壓力測(cè)試無(wú)疑是測(cè)量系統(tǒng)性能中最常采用的方式,根據(jù)定義的性能目標(biāo)對(duì)系統(tǒng)進(jìn)行壓力測(cè)試,以確定系統(tǒng)是否滿足性能要求,同時(shí)也可以根據(jù)壓力測(cè)試的結(jié)果來(lái)分析系統(tǒng)的瓶頸

7、,進(jìn)而進(jìn)行對(duì)應(yīng)的調(diào)優(yōu),可用于做壓力測(cè)試的工具還是不少的,像loadrunner、Jmeter等。由于性能測(cè)試屬于測(cè)試團(tuán)隊(duì)的工作范疇,就不在這展開(kāi)去講了。1.3、分析性能瓶頸根據(jù)測(cè)量系統(tǒng)性能的結(jié)果,多數(shù)是可以分析出系統(tǒng)性能瓶頸,同時(shí)還可以結(jié)合像jvm堆棧、jprofiler、系統(tǒng)日志等來(lái)進(jìn)行進(jìn)一步的確定,另外也可以根據(jù)性能調(diào)優(yōu)人員的經(jīng)驗(yàn),例如可以去了解開(kāi)發(fā)人員是否采用了不適合的數(shù)據(jù)結(jié)構(gòu)等。2. JVM性能調(diào)優(yōu)工作中我們使用開(kāi)源的J2EE容器較多,一般常用的就是tomcat及jboss,網(wǎng)上對(duì)tomcat和jboss進(jìn)行優(yōu)化的資料很多,本文僅僅對(duì)JVM參數(shù)進(jìn)行討論。2.1、JVM內(nèi)存組成及分配2.

8、1.1、JAVA內(nèi)存組成介紹:堆(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)存稱為非堆內(nèi)存(Non-heap memory)”??梢钥闯鯦VM主要管理兩種類(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)存中。組成圖l 方法棧

9、&本地方法棧線程創(chuàng)建時(shí)產(chǎn)生,方法執(zhí)行時(shí)生成棧幀l 方法區(qū)存儲(chǔ)類(lèi)的元數(shù)據(jù)信息 常量等l 堆Java代碼中所有的new操作l native Memory(C heap)Direct Bytebuffer JNI Compile GC2.1.2、堆內(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)整堆的大小。對(duì)象的堆內(nèi)存

10、由稱為垃圾回收器的自動(dòng)內(nèi)存管理系統(tǒng)回收。組成詳解Young Generation即圖中的Eden + From Space + To SpaceEden存放新生的對(duì)象Survivor Space有兩個(gè),存放每次垃圾回收后存活的對(duì)象Old GenerationTenured Generation 即圖中的Old Space 主要存放應(yīng)用程序中生命周期長(zhǎng)的存活對(duì)象2.1.3、非堆內(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。組成詳解Permanent Generation保存虛擬

11、機(jī)自己的靜態(tài)(refective)數(shù)據(jù)主要存放加載的Class類(lèi)級(jí)別靜態(tài)對(duì)象如class本身,method,field等等permanent generation空間不足會(huì)引發(fā)full GC(詳見(jiàn)HotSpot VM GC種類(lèi))Code Cache用于編譯和保存本地代碼(native code)的內(nèi)存JVM內(nèi)部處理或優(yōu)化2.1.4、JVM內(nèi)存限制(最大值)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),而64b

12、it以上的處理器就不會(huì)有限制了。2.2、JVM參數(shù)詳解參數(shù)名稱含義默認(rèn)值 -Xms初始堆大小物理內(nèi)存的1/64(<1GB)默認(rèn)(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制.-Xmx最大堆大小物理內(nèi)存的1/4(<1GB)默認(rèn)(MaxHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存大于70%時(shí),JVM會(huì)減少堆直到 -Xms的最小限制-Xmn年輕代大小(1.4or lator) 注意:此處的大小是(eden+ 2 survivor space).與jmap -heap中顯示的New gen是不同的。整個(gè)堆大小=年輕代大小

13、 + 年老代大小 + 持久代大小.增大年輕代后,將會(huì)減小年老代大小.此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8-XX:NewSize設(shè)置年輕代大小(for 1.3/1.4) -XX:MaxNewSize年輕代最大值(for 1.3/1.4) -XX:PermSize設(shè)置持久代(perm gen)初始值物理內(nèi)存的1/64 -XX:MaxPermSize設(shè)置持久代最大值物理內(nèi)存的1/4 -Xss每個(gè)線程的堆棧大小 JDK5.0以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K.更具應(yīng)用的線程所需內(nèi)存大小進(jìn)行 調(diào)整.在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程.但是操作系統(tǒng)對(duì)

14、一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無(wú)限生成,經(jīng)驗(yàn)值在30005000左右一般小的應(yīng)用, 如果棧不是很深, 應(yīng)該是128k夠用的 大的應(yīng)用建議使用256k。這個(gè)選項(xiàng)對(duì)性能影響比較大,需要嚴(yán)格的測(cè)試。(校長(zhǎng))和threadstacksize選項(xiàng)解釋很類(lèi)似,官方文檔似乎沒(méi)有解釋,在論壇中有這樣一句話:"”-Xss is translated in a VM flag named ThreadStackSize”一般設(shè)置這個(gè)值就可以了。-XX:ThreadStackSizeThread Stack Size (0 means use default stack size) Sparc: 5

15、12; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.-XX:NewRatio年輕代(包括Eden和兩個(gè)Survivor區(qū))與年老代的比值(除去持久代) -XX:NewRatio=4表示年輕代與年老代所占比值為1:4,年輕代占整個(gè)堆棧的1/5Xms=Xmx并且設(shè)置了Xmn的情況下,該參數(shù)不需要進(jìn)行設(shè)置。-XX:SurvivorRatioEden區(qū)與Survivor區(qū)的大小比值 設(shè)

16、置為8,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:8,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/10-XX:LargePageSizeInBytes內(nèi)存頁(yè)的大小不可設(shè)置過(guò)大, 會(huì)影響Perm的大小 =128m-XX:+UseFastAccessorMethods原始類(lèi)型的快速優(yōu)化 -XX:+DisableExplicitGC關(guān)閉System.gc() 這個(gè)參數(shù)需要嚴(yán)格的測(cè)試-XX:MaxTenuringThreshold垃圾最大年齡 如果設(shè)置為0的話,則年輕代對(duì)象不經(jīng)過(guò)Survivor區(qū),直接進(jìn)入年老代. 對(duì)于年老代比較多的應(yīng)用,可以提高效率.如果將此值設(shè)置為一個(gè)較大值,則年輕代對(duì)象會(huì)

17、在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象再年輕代的存活 時(shí)間,增加在年輕代即被回收的概率該參數(shù)只有在串行GC時(shí)才有效.-XX:+AggressiveOpts加快編譯 -XX:+UseBiasedLocking鎖機(jī)制的性能改善 -Xnoclassgc禁用垃圾回收 -XX:SoftRefLRUPolicyMSPerMB每兆堆空閑空間中SoftReference的存活時(shí)間1ssoftly reachable objects will remain alive for some amount of time after the last time they were referenced.

18、The default value is one second of lifetime per free megabyte in the heap-XX:PretenureSizeThreshold對(duì)象超過(guò)多大是直接在舊生代分配0單位字節(jié) 新生代采用Parallel Scavenge GC時(shí)無(wú)效另一種直接在舊生代分配的情況是大的數(shù)組對(duì)象,且數(shù)組中無(wú)外部引用對(duì)象.-XX:TLABWasteTargetPercentTLAB占eden區(qū)的百分比1% -XX:+CollectGen0FirstFullGC時(shí)是否先YGCfalse 并行收集器相關(guān)參數(shù)-XX:+UseParallelGCFull GC采

19、用parallel MSC(此項(xiàng)待驗(yàn)證) 選擇垃圾收集器為并行收集器.此配置僅對(duì)年輕代有效.即上述配置下,年輕代使用并發(fā)收集,而年老代仍舊使用串行收集.(此項(xiàng)待驗(yàn)證)-XX:+UseParNewGC設(shè)置年輕代為并行收集 可與CMS收集同時(shí)使用JDK5.0以上,JVM會(huì)根據(jù)系統(tǒng)配置自行設(shè)置,所以無(wú)需再設(shè)置此值-XX:ParallelGCThreads并行收集器的線程數(shù) 此值最好配置與處理器數(shù)目相等 同樣適用于CMS-XX:+UseParallelOldGC年老代垃圾收集方式為并行收集(Parallel Compacting) 這個(gè)是JAVA 6出現(xiàn)的參數(shù)選項(xiàng)-XX:MaxGCPauseMilli

20、s每次年輕代垃圾回收的最長(zhǎng)時(shí)間(最大暫停時(shí)間) 如果無(wú)法滿足此時(shí)間,JVM會(huì)自動(dòng)調(diào)整年輕代大小,以滿足此值.-XX:+UseAdaptiveSizePolicy自動(dòng)選擇年輕代區(qū)大小和相應(yīng)的Survivor區(qū)比例 設(shè)置此選項(xiàng)后,并行收集器會(huì)自動(dòng)選擇年輕代區(qū)大小和相應(yīng)的Survivor區(qū)比例,以達(dá)到目標(biāo)系統(tǒng)規(guī)定的最低相應(yīng)時(shí)間或者收集頻率等,此值建議使用并行收集器時(shí),一直打開(kāi).-XX:GCTimeRatio設(shè)置垃圾回收時(shí)間占程序運(yùn)行時(shí)間的百分比 公式為1/(1+n)-XX:+ScavengeBeforeFullGCFull GC前調(diào)用YGCtrueDo young generation GC pri

21、or to a full GC. (Introduced in 1.4.1.)CMS相關(guān)參數(shù)-XX:+UseConcMarkSweepGC使用CMS內(nèi)存收集 測(cè)試中配置這個(gè)以后,-XX:NewRatio=4的配置失效了,原因不明.所以,此時(shí)年輕代大小最好用-Xmn設(shè)置.?-XX:+AggressiveHeap 試圖是使用大量的物理內(nèi)存長(zhǎng)時(shí)間大內(nèi)存使用的優(yōu)化,能檢查計(jì)算資源(內(nèi)存, 處理器數(shù)量)至少需要256MB內(nèi)存大量的CPU內(nèi)存, (在1.4.1在4CPU的機(jī)器上已經(jīng)顯示有提升)-XX:CMSFullGCsBeforeCompaction多少次后進(jìn)行內(nèi)存壓縮 由于并發(fā)收集器不對(duì)內(nèi)存空間進(jìn)行壓

22、縮,整理,所以運(yùn)行一段時(shí)間以后會(huì)產(chǎn)生"碎片",使得運(yùn)行效率降低.此值設(shè)置運(yùn)行多少次GC以后對(duì)內(nèi)存空間進(jìn)行壓縮,整理.-XX:+CMSParallelRemarkEnabled降低標(biāo)記停頓 -XX+UseCMSCompactAtFullCollection在FULL GC的時(shí)候, 對(duì)年老代的壓縮 CMS是不會(huì)移動(dòng)內(nèi)存的, 因此, 這個(gè)非常容易產(chǎn)生碎片, 導(dǎo)致內(nèi)存不夠用, 因此, 內(nèi)存的壓縮這個(gè)時(shí)候就會(huì)被啟用。 增加這個(gè)參數(shù)是個(gè)好習(xí)慣。可能會(huì)影響性能,但是可以消除碎片-XX:+UseCMSInitiatingOccupancyOnly使用手動(dòng)定義初始化定義開(kāi)始CMS收集 禁止h

23、ostspot自行觸發(fā)CMS GC-XX:CMSInitiatingOccupancyFraction=70使用cms作為垃圾回收使用70后開(kāi)始CMS收集92為了保證不出現(xiàn)promotion failed(見(jiàn)下面介紹)錯(cuò)誤,該值的設(shè)置需要滿足以下公式CMSInitiatingOccupancyFraction計(jì)算公式-XX:CMSInitiatingPermOccupancyFraction設(shè)置Perm Gen使用到達(dá)多少比率時(shí)觸發(fā)92 -XX:+CMSIncrementalMode設(shè)置為增量模式 用于單CPU情況-XX:+CMSClassUnloadingEnabled 輔助信息-XX:+P

24、rintGC 輸出形式:GC 118250K->113543K(130112K), 0.0094143 secsFull GC 121376K->10414K(130112K), 0.0650971 secs-XX:+PrintGCDetails 輸出形式:GC DefNew: 8614K->781K(9088K), 0.0123035 secs 118250K->113543K(130112K), 0.0124633 secsGC DefNew: 8614K->8614K(9088K), 0.0000665 secsTenured: 112761K->10

25、414K(121024K), 0.0433488 secs 121376K->10414K(130112K), 0.0436268 secs-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps 可與-XX:+PrintGC -XX:+PrintGCDetails混合使用輸出形式:11.851: GC 98328K->93620K(130112K), 0.0082960 secs-XX:+PrintGCApplicationStoppedTime打印垃圾回收期間程序暫停的時(shí)間.可與上面混合使用 輸出形式:Total time fo

26、r which application threads were stopped: 0.0468229 seconds-XX:+PrintGCApplicationConcurrentTime打印每次垃圾回收前,程序未中斷的執(zhí)行時(shí)間.可與上面混合使用 輸出形式:Application time: 0.5291524 seconds-XX:+PrintHeapAtGC打印GC前后的詳細(xì)堆棧信息 -Xloggc:filename把相關(guān)日志信息記錄到文件以便分析.與上面幾個(gè)配合使用 -XX:+PrintClassHistogramgarbage collects before printing th

27、e histogram. -XX:+PrintTLAB查看TLAB空間的使用情況 XX:+PrintTenuringDistribution查看每次minor GC后新的存活周期的閾值 Desired survivor size 1048576 bytes, new threshold 7 (max 15)new threshold 7即標(biāo)識(shí)新的存活周期的閾值為7。2.3、參數(shù)配置示例示例參數(shù)僅供參考:-server-Xms6000M-Xmx6000M-Xmn500M-XX:PermSize=500M-XX:MaxPermSize=500M-XX:SurvivorRatio=65536-XX:

28、MaxTenuringThreshold=0-Xnoclassgc-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction=0-XX:+CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled-XX:CMSInitiatingOccupancyFraction=90-XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassH

29、istogram-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC說(shuō)明: -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0就是去掉了救助空間; -Xnoclassgc禁用類(lèi)垃圾回收,性能會(huì)高一點(diǎn); -XX:+DisableExplicitGC禁止System.gc(),免得程序員誤調(diào)用gc方法影響性能; -XX:+UseParNewGC,對(duì)年輕代采用多線程并行回收,這樣收得快; 帶CMS參數(shù)的都是和并發(fā)回收相關(guān)的,不明白的可以查看上面的參數(shù)詳解或上網(wǎng)搜索。 CMSInitia

30、tingOccupancyFraction,這個(gè)參數(shù)設(shè)置有很大技巧,基本上滿足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不會(huì)出現(xiàn)promotion failed。在我的應(yīng)用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90說(shuō)明年老代到90%滿的時(shí)候開(kāi)始執(zhí)行對(duì)年老代的并發(fā)垃圾回收(CMS),這時(shí)還剩10%的空間是5500*10%=550兆,所以即使Xmn(也就是年輕代共500兆)里所有對(duì)象都搬到年老代里,550兆

31、的空間也足夠了,所以只要滿足上面的公式,就不會(huì)出現(xiàn)垃圾回收時(shí)的promotion failed;3. J2EE應(yīng)用監(jiān)控J2EE應(yīng)用在運(yùn)行過(guò)程中,我們可以通過(guò)多種監(jiān)控手段來(lái)對(duì)應(yīng)用進(jìn)行監(jiān)控,監(jiān)控的內(nèi)容包括數(shù)據(jù)庫(kù)資源的訪問(wèn),CPU占用,內(nèi)存占用,運(yùn)行狀態(tài)。通過(guò)對(duì)容器及應(yīng)用的監(jiān)控,找出性能瓶頸,提高應(yīng)用的性能。3.1、數(shù)據(jù)庫(kù)連接池監(jiān)控(Druid)應(yīng)用系統(tǒng)性能出現(xiàn)問(wèn)題,首先考慮進(jìn)行排查的就是數(shù)據(jù)調(diào)用的性能問(wèn)題,是否存在性能較差的查詢,是否表結(jié)構(gòu)設(shè)計(jì)需要進(jìn)行優(yōu)化,是否加載了過(guò)多的數(shù)據(jù),占用了I/O及帶寬。公司JAVA平臺(tái)采用了阿里巴巴的開(kāi)源數(shù)據(jù)庫(kù)連接池,能夠?qū)?shù)據(jù)庫(kù)的訪問(wèn)及操作提供實(shí)時(shí)的監(jiān)控及分析。3.

32、1.1、Druid連接池配置v 下載Druid1、 下載jar包maven central repository:/maven2/com/alibaba/druid/alibaba maven repository:2、 或配置Maven依賴,在Maven配置文件pom.xml中添加依賴v 開(kāi)啟Druid內(nèi)置監(jiān)控頁(yè)面Druid內(nèi)置提供了一個(gè)StatViewServlet用于展示Druid的統(tǒng)計(jì)信息。這個(gè)StatViewServlet的用途包括:l 提供監(jiān)控信息展示的html頁(yè)面l 提供監(jiān)控信息的JSON API注意:使用StatViewServlet,

33、建議使用druid 0.2.6以上版本。1、 配置web.xml根據(jù)配置中的url-pattern來(lái)訪問(wèn)內(nèi)置監(jiān)控頁(yè)面,如果是上面的配置,內(nèi)置監(jiān)控頁(yè)面的首頁(yè)是/druid/index.html例如:http:/localhost:8080/druid/index.html 2、 配置allow和denyStatViewSerlvet展示出來(lái)的監(jiān)控信息比較敏感,是系統(tǒng)運(yùn)行的內(nèi)部情況,如果你需要做訪問(wèn)控制,可以配置allow和deny這兩個(gè)參數(shù)。比如:判斷規(guī)則v deny優(yōu)先于allow,如果在deny列表中,就算在allow列表中,也會(huì)被拒絕。v 如果allow沒(méi)有配置或者為空,則允許所有訪問(wèn)。3

34、.1.2、Druid連接池監(jiān)控若要開(kāi)啟更多監(jiān)控,請(qǐng)參見(jiàn)Druid官方文檔:Druid監(jiān)控界面截圖:首頁(yè)數(shù)據(jù)源SQL監(jiān)控3.2、容器管理及監(jiān)控(psi-probe)PSI Probe 是一個(gè) Lambda Probe 的后續(xù)版本,主要是為了替換 Tomcat 自帶的管理器,可方便的管理和監(jiān)控 Tomcat及Jboss 實(shí)例(Jboss不支持7以上版本)。3.2.1、Tomcat下安裝部署1. 下載地址2. 安裝1 解壓,將probe.war放進(jìn)webapps目錄。2 修改CATALINA_HOME/conf/tomcat-users.xml增加probe角色及人員,以Tomcat7為例:3 其他

35、配置如果要查看System Information,Linux版本:catalina.sh中加入如下語(yǔ)句:JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"windows版本:catalina.bat中加入:SET JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote4 訪問(wèn)監(jiān)控應(yīng)用例如:http:/localhost:8080/probe3. 權(quán)限控制probe有 probeuser、poweruser、poweruserplus、manager(針對(duì)不同tomca

36、t版本)等角色,對(duì)應(yīng)可操作的功能如下表:特別注意一點(diǎn):表格里面的X表示擁有權(quán)限,也就是說(shuō),manager的權(quán)限是最大的,什么都能操作。在實(shí)際的生產(chǎn)運(yùn)維過(guò)程中,運(yùn)維人員可以創(chuàng)建具有manager操作權(quán)限的賬號(hào),用于應(yīng)用的部署及服務(wù)的維護(hù)相關(guān)操作。而為了方便項(xiàng)目組開(kāi)發(fā)人員對(duì)本項(xiàng)目的維護(hù)和操作,可以開(kāi)放權(quán)限較小的賬號(hào),便于跟蹤應(yīng)用的運(yùn)行狀態(tài),下載分析錯(cuò)誤日志及操作日志。Features by RoleprobeuserpoweruserpoweruserplusmanagerContext: listXXXXContext: statusXXXXContext: view servletsXXXXC

37、ontext: view servlet mappingsXXXXContext: view filtersXXXXContext: view filter mappingsXXXXContext: list attributesXXXXContext: remove attributesXXXContext: startXXXContext: stopXXXContext: view web.xmlXXXContext: view context.xmlXContext: deployXContext: undeployXSession: listXXXXSession: list attr

38、ibutesXXXXSession: search attributesXXXXSession: remove attributesXXXSession: view last-accessed IPXXXXSession: expire singleXXXSession: expire multipleXXXJSP: listXXXJSP: view sourceXXXJSP: view servlet sourceXXXJSP: compile singleXXXJSP: compile multipleXXXJSP: compile all on deploymentXJSP: disca

39、rd all compiledXData Source: listXXXXData Source: group by JDBC URLXXXXData Source: statusXXXXData Source: resetXXXData Source: testXXData Source: view query historyXXData Source: execute SQLXXLog: listXXXXLog: tail in real-timeXXXXLog: downloadXXXXLog: change levelXThread: listXXXXThread: list pool

40、sXXXXThread: view execution stackXXXThread: killXConnector: statusXXXXConnector: real-time usage chartsXXXXCluster: statusXXXXCluster: real-time traffic chartsXXXXJVM: real-time memory usage chartsXXXXJVM: statusXXXXJVM: advise GCXJava Service Wrapper: statusXXXXJava Service Wrapper: restart JVMXSys

41、tem: overviewXXXXSystem: propertiesXXXXSystem: OS detailsXQuick Check: executeX3.2.2、probe監(jiān)控界面應(yīng)用程序(可以啟動(dòng)/停止/卸載應(yīng)用)應(yīng)用發(fā)布(發(fā)布應(yīng)用)日志(可以在線查看,下載日志)日志(動(dòng)態(tài)調(diào)整日志級(jí)別)線程監(jiān)控系統(tǒng)信息運(yùn)行監(jiān)控運(yùn)行監(jiān)控3.3、JAVA虛擬機(jī)監(jiān)控(Visual VM)VisualVM 提供在 Java 虛擬機(jī) (Java Virutal Machine, JVM) 上運(yùn)行的Java 應(yīng)用程序的詳細(xì)信息。在 VisualVM 的圖形用戶界面中,您可以方便、快 捷地查看多個(gè)Java 應(yīng)用程

42、序的相關(guān)信息。 (摘自官方) 簡(jiǎn)單說(shuō)來(lái),VisualVM 是一種集成了多個(gè)JDK 命令行工具的可視化工具,它能為您提供強(qiáng)大的分析能力。所有這些都是免費(fèi)的!它囊括的命令行工具包括 jstat, JConsole, jstack, jmap 和 jinfo,這些工具與JDK 的標(biāo)準(zhǔn)版本是一致的。 可以使用VisualVM 生成和分析海量數(shù)據(jù)、跟蹤內(nèi)存泄漏、監(jiān)控垃圾回收器、執(zhí)行內(nèi)存和CPU 分析,同時(shí)它還支持在MBeans 上進(jìn)行瀏覽和操作。盡管VisualVM 自身要在JDK6 這個(gè)版本上運(yùn)行,但是JDK1.4 以上版本的程序它都能監(jiān)控。 3.3.1、VisualVM安裝VisualVM 的一個(gè)最

43、大好處就是,它已經(jīng)在你的JDK bin目錄里了,只要你使 用的是JDK1.6 Update7 之后的版本。點(diǎn)擊一下jvisualvm.exe 圖標(biāo)它就可以運(yùn)行了。 這里是VisualVM 的官方網(wǎng)站:,資料很全,同時(shí)提供VisualVM 最近版本下載。3.3.2、VisualVM簡(jiǎn)介Visual VM 啟動(dòng)成功!可以看到Visual VM 的界面了。通過(guò)Visual VM 可以看到本機(jī)運(yùn)行中的所有Java 應(yīng)用。你會(huì)發(fā)現(xiàn)根本不需要在VisualVM 里為Java應(yīng)用程序注冊(cè),它們就會(huì)自動(dòng)顯示出來(lái)。甚至還可以在導(dǎo)航欄里查看到遠(yuǎn)程的Java應(yīng)用。導(dǎo)航欄即為Applications,其中分為L(zhǎng)oca

44、l(本地Java 應(yīng)用)和Remote(遠(yuǎn)程的Java 應(yīng)用)。 3.3.3、安裝插件Visual VM 有很多好用的插件;而且Sun 為了推廣Visual VM,還舉辦的Visual VM 插件開(kāi)發(fā)大賽。如何安裝插件呢?步驟如下:1 點(diǎn)擊 工具 -> 插件2 推薦安裝全部插件(本演示已經(jīng)安裝,所以僅顯示已安裝,可用插件為空)3.3.4、監(jiān)控本地JAVA應(yīng)用Visual VM 本身就是一個(gè)Java 應(yīng)用,所以打開(kāi)Visual VM看到的第一個(gè)可監(jiān)控應(yīng)用就是Visual VM 本身;可以用它熱熱身,小試下牛刀。在Visual VM可視化界面中可以監(jiān)控到Visual VM 本身的內(nèi)存使用情況

45、、線程情況、Jvm 啟動(dòng)參數(shù)、cpu 消耗情況、垃圾回收情況等很多參數(shù)。當(dāng)然如果在本地啟一個(gè)Tomcat一樣可以看到這些參數(shù),可以方便我們?cè)诒镜貙?duì)JVM 進(jìn)行調(diào)優(yōu)。3.3.5、監(jiān)控遠(yuǎn)程JAVA應(yīng)用監(jiān)視遠(yuǎn)程Java 應(yīng)用稍微復(fù)雜些。Visual VM是通過(guò)JMX 來(lái)和遠(yuǎn)程Java 應(yīng)用聯(lián)系的。 JMX:Java Management Extensions,即Java 管理擴(kuò)展,是一個(gè)為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。JMX 可以跨越一系列異構(gòu)操作系統(tǒng)平臺(tái)、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議,靈活的開(kāi)發(fā)無(wú)縫集成的系統(tǒng)、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。 下面以4 上的tomcat 7為例,敘述下監(jiān)視遠(yuǎn)程Java 應(yīng)用的步驟 如

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論