jvm調(diào)優(yōu)其實(shí)就是對Young代的次數(shù)與時(shí)間調(diào)優(yōu)_第1頁
jvm調(diào)優(yōu)其實(shí)就是對Young代的次數(shù)與時(shí)間調(diào)優(yōu)_第2頁
jvm調(diào)優(yōu)其實(shí)就是對Young代的次數(shù)與時(shí)間調(diào)優(yōu)_第3頁
jvm調(diào)優(yōu)其實(shí)就是對Young代的次數(shù)與時(shí)間調(diào)優(yōu)_第4頁
jvm調(diào)優(yōu)其實(shí)就是對Young代的次數(shù)與時(shí)間調(diào)優(yōu)_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、jvm調(diào)優(yōu)其實(shí)就是對Young代的次數(shù)與時(shí)間調(diào)優(yōu)最近在做埋點(diǎn)監(jiān)控,做到j(luò)vm這一塊。剛好可以理一下思路:看過很多jvm理論的文章,總覺得講得太復(fù)雜了,但用來也就那么幾個(gè)參數(shù)。so,化繁為簡,只記我要用的。1為什么會(huì)00M溢出,是持久代滿了。2堆與棧(非堆no-heap)區(qū)別,堆主要用于存儲(chǔ)new信息,棧用于線程開銷,通過jstatpid100s查看棧的一般都是水平的趨勢。3.堆又分eden,survivor區(qū),由eden向survivorcopy.常常說的調(diào)優(yōu),主要是對針gc次數(shù),時(shí)間,而這一塊主要集中在Yong代,而設(shè)置的-xmx(最大),-xms(最小)的大小又與gc的頻率與次數(shù)有關(guān)。gc

2、回收機(jī)制常用的有五種,可以組合使用jvm不復(fù)雜,設(shè)置內(nèi)存最大小值,線程數(shù)據(jù),持久代數(shù)據(jù),真正考驗(yàn)功力的是根據(jù)不同的使用場景選用合適的gc回收機(jī)機(jī)制,合理設(shè)置內(nèi)存,線程,持久代數(shù)據(jù)6.jstat的用法IC1M個(gè)W7M3DWIAK1WICcOMCiIQDftJOIGUTiDDI啦沏IWM4ICdH沏IDUDICdMOTDrtB個(gè)1DHL3D1HDQDD1D.DQ3IQdlFflO1Qfi.m1030llhKHIDtl&DOIDtl&XlUlDfrlfiIQdQKHIfrOI即咖IDtfftDQMtfBSHAurrMflpumSiHhwIKOtiXl1HM30ICtlOI測加IMcQOIHD&30I

3、ttMOIfrOTMIQlUC#(/以下是選用別的人作為參考理JVM學(xué)習(xí)筆記之JVM內(nèi)存管理和JVM垃圾回收的概念,JVM內(nèi)存結(jié)構(gòu)由堆、棧、本地方法棧、方法區(qū)等部分組成,另外JVM分別對新生代和舊生代采用不同的垃圾回收機(jī)制。首先來看一下JVM內(nèi)存結(jié)構(gòu),它是由堆、棧、本地方法棧、方法區(qū)等部分組成,結(jié)構(gòu)圖如下所示。JVM學(xué)習(xí)筆記JVM內(nèi)存管理和JVM垃圾回收J(rèn)VM內(nèi)存組成結(jié)構(gòu)JVM內(nèi)存結(jié)構(gòu)由堆、棧、本地方法棧、方法區(qū)等部分組成,結(jié)構(gòu)圖如下所示:1)堆所有通過new創(chuàng)建的對象的內(nèi)存都在堆中分配,其大小可以通過-Xmx和-Xms來控制。堆被劃分為新生代和舊生代,新生代又被進(jìn)一步劃分為Eden和Surv

4、ivor區(qū),最后Survivor由FromSpace和ToSpace組成,結(jié)構(gòu)圖如下所示:SurvivorRatioOldGenerationPermanentSpacePerm-aneniGeneration新生代。新建的對象都是用新生代分配內(nèi)存,Eden空間不足的時(shí)候,會(huì)把存活的對象轉(zhuǎn)移到Survivor中,新生代大小可以由-Xmn來控制,也可以用-XX:SurvivorRatio來控制Eden和Survivor的比例舊生代。用于存放新生代中經(jīng)過多次垃圾回收仍然存活的對象2)棧每個(gè)線程執(zhí)行每個(gè)方法的時(shí)候都會(huì)在棧中申請一個(gè)棧幀,每個(gè)棧幀包括局部變量區(qū)和操作數(shù)棧,用于存放此次方法調(diào)用過程中的臨

5、時(shí)變量、參數(shù)和中間結(jié)果3)本地方法棧用于支持native方法的執(zhí)行,存儲(chǔ)了每個(gè)native方法調(diào)用的狀態(tài)4)方法區(qū)存放了要加載的類信息、靜態(tài)變量、final類型的常量、屬性和方法信息。JVM用持久代(PermanetGeneration)來存放方法區(qū),可通過-XX:PermSize和-XX:MaxPermSize來指定最小值和最大值。介紹完了JVM內(nèi)存組成結(jié)構(gòu),下面我們再來看一下JVM垃圾回收機(jī)制。JVM垃圾回收機(jī)制JVM分別對新生代和舊生代采用不同的垃圾回收機(jī)制新生代的GC:新生代通常存活時(shí)間較短,因此基于Copying算法來進(jìn)行回收,所謂Copying算法就是掃描出存活的對象,并復(fù)制到一塊

6、新的完全未使用的空間中,對應(yīng)于新生代,就是在Eden和FromSpace或ToSpace之間copy。新生代采用空閑指針的方式來控制GC觸發(fā),指針保持最后一個(gè)分配的對象在新生代區(qū)間的位置,當(dāng)有新的對象要分配內(nèi)存時(shí),用于檢查空間是否足夠,不夠就觸發(fā)GC。當(dāng)連續(xù)分配對象時(shí),對象會(huì)逐漸從eden到survivor,最后到舊生代,用javavisualVM來查看,能明顯觀察到新生代滿了后,會(huì)把對象轉(zhuǎn)移到舊生代,然后清空繼續(xù)裝載,當(dāng)舊生代也滿了后,就會(huì)報(bào)outofmemory的異常,如下圖所示:rfern-CtEipileline:2L75canpiles-1.321eAlL1L1ALJU1.J1J1L

7、11L1MCltsELoaderTime:3106ltidel,Eiunloidei-6.T56sGCTine;39Dco口EEtionE,1.449sLastC&use;ilrIx4wt.r4Space(11STEM,15D0M):1.D37M,3關(guān)eollecbL.!83s:SnrriTsrC(1.438比192.D00I0:0idJLt:.db.luAJli.kXa.-Eurdvor1lDOOK):tl4.rg7K.二dJLxllj1u.-jjj.-x1llljjJ.!.jl1jAxjJ.lxlLXjA.iAiALA.iAjj.xxILljjjAx-XjjJ-lljjLllAAu.Llj

8、-lLLLxj.xllLlAulAjlAiAi-OilGen(ITT.250(1,Z2.1BSH):16.819M,1265.862hE-FtrmGen$4.G0(MJH.7ank14.523M在執(zhí)行機(jī)制上JVM提供了串行GC(SerialGC)、并行回收GC(ParallelScavenge)和并行GC(ParNew)串行GC在整個(gè)掃描和復(fù)制過程采用單線程的方式來進(jìn)行,適用于單CPU、新生代空間較小及對暫停時(shí)間要求不是非常高的應(yīng)用上,是client級別默認(rèn)的GC方式,可以通過-XX:+UseSerialGC來強(qiáng)制指定并行回收GC在整個(gè)掃描和復(fù)制過程采用多線程的方式來進(jìn)行,適用于多CPU、對暫

9、停時(shí)間要求較短的應(yīng)用上,是server級別默認(rèn)采用的GC方式,可用-XX:+UseParallelGC來強(qiáng)制指定,用-XX:ParallelGCThreads=4來指定線程數(shù)并行GC與舊生代的并發(fā)GC配合使用舊生代的GC:舊生代與新生代不同,對象存活的時(shí)間比較長,比較穩(wěn)定,因此采用標(biāo)記(Mark)算法來進(jìn)行回收,所謂標(biāo)記就是掃描出存活的對象,然后再進(jìn)行回收未被標(biāo)記的對象,回收后對用空出的空間要么進(jìn)行合并,要么標(biāo)記出來便于下次進(jìn)行分配,總之就是要減少內(nèi)存碎片帶來的效率損耗。在執(zhí)行機(jī)制上JVM提供了串行GC(SerialMSC)、并行GC(parallelMSC)和并發(fā)GC(CMS),具體算法細(xì)節(jié)

10、還有待進(jìn)一步深入研究。以上各種GC機(jī)制是需要組合使用的,指定方式由下表所示:指定肓式新生代舊生代GC方式-XX:+UseSerialGC串行G匚串行GC-XX:刖謝GC并行回收GC并行GC-XX:+UseConeMarkSweepGC并行GC并發(fā)GC-XX:+UseParJewGC并行X串行GC-XX:+UseParallelOldGC并行回收GC并行GC-XX;+UseConeMarkSweepGC-XX:+UseParrJewGC串行GC并發(fā)GC不支持的組合-XX:-UseParNewGC-XX:KJseParallellOldGC2、-XX:-UseParNewGC-XX:+UseSer

11、1alGCjstate用法:Jstat是JDK自帶的一個(gè)輕量級小工具。全稱JavaVirtualMachinestatisticsmonitoringtool,它位于java的bin目錄下,主要利用JVM內(nèi)建的指令對Java應(yīng)用程序的資源和性能進(jìn)行實(shí)時(shí)的命令行的監(jiān)控,包括了對Heapsize和垃圾回收狀況的監(jiān)控。可見,Jstat是輕量級的、專門針對JVM的工具,非常適用。由于JVM內(nèi)存設(shè)置較大,圖中百分比變化不太明顯一個(gè)極強(qiáng)的監(jiān)視VM內(nèi)存工具。可以用來監(jiān)視VM內(nèi)存內(nèi)的各種堆和非堆的大小及其內(nèi)存使用量。jstat工具特別強(qiáng)大,有眾多的可選項(xiàng),詳細(xì)查看堆內(nèi)各個(gè)部分的使用量,以及加載類的數(shù)量。使用時(shí)

12、,需加上查看進(jìn)程的進(jìn)程id,和所選參數(shù)。執(zhí)行:cd$JAVA_HOME/bin中執(zhí)行jstat,注意jstat后一定要跟參數(shù)。語法結(jié)構(gòu):Usage:jstat-help|-optionsjstat-t-h參數(shù)解釋:Options選項(xiàng),我們一般使用-gcutil查看gc情況vmidVM的進(jìn)程號,即當(dāng)前運(yùn)行的java進(jìn)程號intervals|ms間隔時(shí)間,單位為秒或者毫秒,默認(rèn)為ms。必須是正整型。count打印次數(shù),如果缺省則打印無數(shù)次輸出參數(shù):-hn每個(gè)n行輸出一次列表頭。默認(rèn)為0,僅輸出一次。-tn在第一列輸出時(shí)間戳。該時(shí)間戳從jvm啟動(dòng)開始。-JjavaOption具體參數(shù):-class:

13、統(tǒng)計(jì)classloader行為信息-compiler:統(tǒng)計(jì)編譯行為信息-gc:統(tǒng)計(jì)jdkgc時(shí)heap信息-gccapacity:統(tǒng)計(jì)不同的generations(新生代、老生代、永久代)相應(yīng)的heap容量信息-gccause:統(tǒng)計(jì)gc的情況,以及引起gc的事情。同-gcutil-gcnew:統(tǒng)計(jì)新生代的gc情況-gcnewcapacity:統(tǒng)計(jì)新生代gc時(shí)heap的容量信息-gcold:統(tǒng)計(jì)老生代的gc情況-gcoldcapacity:統(tǒng)計(jì)老生代gc時(shí)heap容量信息-gcpermcapacity:統(tǒng)計(jì)永久代gc時(shí)的容量信息-gcutil:統(tǒng)計(jì)heap的gc情況-printcompilati

14、on:沒用過jstat-gcutil:結(jié)果信息:Heap上的Survivorspace0區(qū)已使用空間的百分比Heap上的Survivorspace1區(qū)已使用空間的百分比EHeap上的Edenspace區(qū)已使用空間的百分比OHeap上的Oldspace區(qū)已使用空間的百分比PPermspace區(qū)已使用空間的百分比YGC從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生YoungGC的次數(shù)YGCT-從應(yīng)用程序啟動(dòng)到采樣時(shí)YoungGC所用的時(shí)間(單位秒)FGC從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生FullGC的次數(shù)FGCT-從應(yīng)用程序啟動(dòng)到采樣時(shí)FullGC所用的時(shí)間(單位秒)GCT從應(yīng)用程序啟動(dòng)到采樣時(shí)用于垃圾回收的總時(shí)間(單位秒)

15、jstat-gcutil21891250721891進(jìn)程號;250ms采樣interval;7countS0S1EOPYGCYGCTFGCFGCTGCT12.440.0027.209.4996.70780.17650.4950.67212.440.0062.169.4996.70780.17650.4950.67212.440.0083.979.4996.70780.17650.4950.6720.007.740.009.5196.70790.17750.4950.6730.007.7423.379.5196.70790.17750.4950.6730.007.7443.829.5196.70

16、790.17750.4950.6730.007.7458.119.5196.71790.17750.4950.673以上輸出表明:1.在第三行與第四行,發(fā)生一次新生代gc。本次gc耗時(shí)0.001秒,且有對象從Eden區(qū)提升到老生代,老生代使用率從9.49%上升到9.51%。2.gc之前,survivorspace使用率12.44%,gc后,降為7.74%。jstat-gcnew-h321891250-h3:每隔三行輸出一次列表頭;21891:進(jìn)程號;250:interval采樣間隔,ms;count不設(shè)置,表示打印無數(shù)次S0CS1CS0US1UTTMTTDSSECEUYGCYGCT64.064

17、.00.031.7313132.0512.0178.62490.20364.064.00.031.7313132.0512.0355.52490.20364.064.035.40.023132.0512.021.92500.204S0CS1CS0US1UTTMTTDSSECEUYGCYGCT64.064.035.40.023132.0512.0245.92500.20464.064.035.40.023132.0512.0421.12500.20464.064.00.019.0313132.0512.084.42510.204S0CS1CS0US1UTTMTTDSSECEUYGCYGCT64.

18、064.00.019.0313132.0512.0306.72510.204以上輸出表明:SOU:survivorspace0utilizationDSS:desiredsurvivorSizeTT:tenuringthreshold閥值,用于控制對象在新生代存活的最大次數(shù)第二行和第三行之間,發(fā)生一次新生代gc。耗時(shí)為0.001秒。本次gc發(fā)現(xiàn)較多的存活對象,且S0U超過了DSS,因此,將存活對象提升到老生代(這里沒有顯示)。并將TT從31降到2.另一次gc發(fā)生在第5行和第6行,本次gc發(fā)現(xiàn)較少的幸存對象,并將閥值變更為31。jstat-gcoldcapacity-t218912503150.

19、11408.060544.011696.011696.0194802.8743.799150.41408.060544.013820.013820.0194812.9383.863150.71408.060544.013820.013820.0194812.9383.863-t:在第一列輸出時(shí)間戳;21891:進(jìn)程號;250:采樣間隔ms;3采樣次TimestampOGCMNOGCMXOGCOCYGCFGCFGCTGCT以上輸出表明:1.OGC:oldgenerationcapacity老生代空間大小OGCMN:最小OGCOGCMX:最大OGCOC:oldspacecapacityFGC:Fu

20、llGCOGC:oldgenerationcapacityTimestamp從jvm啟動(dòng)的時(shí)間開始。第二行和第三行,經(jīng)過81次fullgc,OGC從11696KB上升到13820KB。老生代最大空間大小OGCMX為60544KB,因此還有上升空間。jstat-gcutilrootlocalhostbin#jstat-gcutil2544410005S0S1EOPYGCYGCTFGCFGCTGCT73.540.0099.0467.5298.491660.25260.3310.58373.540.0099.0467.5298.491660.25260.3310.58373.540.0099.046

21、7.5298.491660.25260.3310.58373.540.0099.0467.5298.491660.25260.3310.58373.540.0099.0467.5298.491660.25260.3310.583可以看到,5次younggc之后,垃圾內(nèi)存被從Edenspace區(qū)(E)放入了Oldspace區(qū)(O),并引起了百分比的變化,導(dǎo)致Survivorspace使用的百分比從73.54%(S0)降到0%(S1)。有效釋放了內(nèi)存空間。綠框中,我們可以看到,一次fullgc之后,Oldspace區(qū)(O)的內(nèi)存被回收,從99.05%降到67.52%。圖中同時(shí)打印了younggc和

22、fullgc的總次數(shù)、總耗時(shí)。而,每次younggc消耗的時(shí)間,可以用相間隔的兩行YGCT相減得到。每次fullgc消耗的時(shí)間,可以用相隔的兩行FGCT相減得到。例如紅框中表示的第一行、第二行之間發(fā)生了1次younggc,消耗的時(shí)間為0.252-0.252=0.0秒。常駐內(nèi)存區(qū)(P)的使用率,始終停留在98.49%左右,說明常駐內(nèi)存沒有突變,比較正常。如果younggc和fullgc能夠正常發(fā)生,而且都能有效回收內(nèi)存,常駐內(nèi)存區(qū)變化不明顯,則說明java內(nèi)存釋放情況正常,垃圾回收及時(shí),java內(nèi)存泄露的幾率就會(huì)大大降低。但也不能說明一定沒有內(nèi)存泄露。GCT是YGCT和FGCT的時(shí)間總和。以上,

23、介紹了Jstat按百分比查看gc情況的功能。其實(shí),它還有功能,例如加載類信息統(tǒng)計(jì)功能、內(nèi)存池信息統(tǒng)計(jì)功能等,那些是以絕對值的形式打印出來的,比較少用,在此就不做介紹。jstat-classpid顯示加載class的數(shù)量,及所占空間等信息。rootlocalhostbin#jstat-class25917LoadedBytesUnloadedBytesTime26292916.82924.60.90jstat-compilerpid顯示VM實(shí)時(shí)編譯的數(shù)量等信息。rootlocalhostbin#jstat-compiler25917CompiledFailedInvalidTimeFailedT

24、ypeFailedMethod768000.700jstat-gccapacity可以顯示,VM內(nèi)存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內(nèi)存使用量,PGCMX顯示的是perm的內(nèi)存最大使用量,PGC是當(dāng)前新生成的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量。其他的可以根據(jù)這個(gè)類推,OC是old內(nèi)純的占用量。rootlocalhostbin#jstat-gccapacity25917TOC o 1-5 h zNGCMN640.0NGCMX4992.0NGC832.0S0C64.0S1C64.0EC704.0OGCMN1408.0OGCMX60544.0OGC9504.0OC9504.0OC是old內(nèi)純的占用量PGCMN8192.0PGCMN顯示的是最小perm的內(nèi)存使用量PGCMX65536.0PGCMX顯示的是perm的內(nèi)存最大使用量PGC12800.0PGC是當(dāng)前新生成的perm內(nèi)存占用量PC12800.0PC是但前perm內(nèi)存占用量YGC164FGC6jstat-gcnewpidnew對象的信息rootlocalhostbin#jstat-gcnew25917SOCS1CSOUS1UTTMTTDSSECEUYGCYGCT64.064.047.40.021532.0704.0145.71680.254jstat-

溫馨提示

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

評論

0/150

提交評論