Jstat在分析java的內(nèi)存GC時(shí)的應(yīng)用
2024-06-28 15:59:50
供稿:網(wǎng)友
jstat工具特別強(qiáng)大,有眾多的可選項(xiàng),詳細(xì)查看堆內(nèi)各個(gè)部分的使用量,以及加載類的數(shù)量。使用時(shí),需加上查看進(jìn)程的進(jìn)程id,和所選參數(shù)。執(zhí)行:cd $java_HOME/bin中執(zhí)行jstat,注意jstat后一定要跟參數(shù)。各個(gè)參數(shù)的意義。 jstat -class pid:顯示加載class的數(shù)量,及所占空間等信息。 jstat -compiler pid:顯示VM實(shí)時(shí)編譯的數(shù)量等信息。 jstat -gc pid:可以顯示gc的信息,查看gc的次數(shù),及時(shí)間。其中最后五項(xiàng),分別是young gc的次數(shù),young gc的時(shí)間,full gc的次數(shù),full gc的時(shí)間,gc的總時(shí)間。 jstat -gccapacity:可以顯示,VM內(nèi)存中三代(young,old,perm)對(duì)象的使用和占用大小,如:PGCMN顯示的是最小perm的內(nèi)存使用量,PGCMX顯示的是perm的內(nèi)存最大使用量,PGC是當(dāng)前新生成的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量。其他的可以根據(jù)這個(gè)類推, OC是old內(nèi)純的占用量。 jstat -gcnew pid:new對(duì)象的信息。 jstat -gcnewcapacity pid:new對(duì)象的信息及其占用量。 jstat -gcold pid:old對(duì)象的信息。 jstat -gcoldcapacity pid:old對(duì)象的信息及其占用量。 jstat -gcpermcapacity pid: perm對(duì)象的信息及其占用量。 jstat -util pid:統(tǒng)計(jì)gc信息統(tǒng)計(jì)。 jstat -PRintcompilation pid:當(dāng)前VM執(zhí)行的信息。 除了以上一個(gè)參數(shù)外,還可以同時(shí)加上 兩個(gè)數(shù)字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,還可以加上-h3每三行顯示一下標(biāo)題。語法結(jié)構(gòu): Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 參數(shù)解釋: Options — 選項(xiàng),我們一般使用 -gcutil 查看gc情況比較多 vmid — VM的進(jìn)程號(hào),即當(dāng)前運(yùn)行的java進(jìn)程號(hào) interval– 間隔時(shí)間,單位為秒或者毫秒 count — 打印次數(shù),如果缺省則打印無數(shù)次 S0 — Heap上的 Survivor space 0 區(qū)已使用空間的百分比 S1 — Heap上的 Survivor space 1 區(qū)已使用空間的百分比 E — Heap上的 Eden space 區(qū)已使用空間的百分比 O — Heap上的 Old space 區(qū)已使用空間的百分比 P — Perm space 區(qū)已使用空間的百分比 YGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Young GC 的次數(shù) YGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Young GC 所用的時(shí)間(單位秒) FGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Full GC 的次數(shù) FGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Full GC 所用的時(shí)間(單位秒) GCT — 從應(yīng)用程序啟動(dòng)到采樣時(shí)用于垃圾回收的總時(shí)間(單位秒)如:[root@localhost bin]# jstat -gcutil 25332 1000 10 (25332是java的進(jìn)程號(hào),ps -ef | grep java)分代概念:分代是Java垃圾收集的一大亮點(diǎn),根據(jù)對(duì)象的生命周期長短,把堆分為3個(gè)代:Young,Old和Permanent,根據(jù)不同代的特點(diǎn)采用不同的收集算法,揚(yáng)長避短也。Young(Nursery),年輕代。研究表明大部分對(duì)象都是朝生暮死,隨生隨滅的。因此所有收集器都為年輕代選擇了復(fù)制算法。復(fù)制算法優(yōu)點(diǎn)是只訪問活躍對(duì)象,缺點(diǎn)是復(fù)制成本高。因?yàn)槟贻p代只有少量的對(duì)象能熬到垃圾收集,因此只需少量的復(fù)制成本。而且復(fù)制收集器只訪問活躍對(duì)象,對(duì)那些占了最大比率的死對(duì)象視而不見,充分發(fā)揮了它遍歷空間成本低的優(yōu)點(diǎn)。Young(年輕代)年 輕代分三個(gè)區(qū)。一個(gè)Eden區(qū),兩個(gè)Survivor區(qū)。大部分對(duì)象在Eden區(qū)中生成。當(dāng)Eden區(qū)滿時(shí),還存活的對(duì)象將被復(fù)制到Survivor區(qū) (兩個(gè)中的一個(gè)),當(dāng)這個(gè)Survivor區(qū)滿時(shí),此區(qū)的存活對(duì)象將被復(fù)制到另外一個(gè)Survivor區(qū),當(dāng)這個(gè)Survivor去也滿了的時(shí)候,從第一 個(gè)Survivor區(qū)復(fù)制過來的并且此時(shí)還存活的對(duì)象,將被復(fù)制“年老區(qū)(Tenured)”。需要注意,Survivor的兩個(gè)區(qū)是對(duì)稱的,沒先后關(guān) 系,所以同一個(gè)區(qū)中可能同時(shí)存在從Eden復(fù)制過來 對(duì)象,和從前一個(gè)Survivor復(fù)制過來的對(duì)象,而復(fù)制到年老區(qū)的只有從第一個(gè)Survivor去過來的對(duì)象。而且,Survivor區(qū)總有一個(gè)是空 的。Tenured(年老代)年老代存放從年輕代存活的對(duì)象。一般來說年老代存放的都是生命期較長的對(duì)象。Perm(持久代)用 于存放靜態(tài)文件,如今Java類、方法等。持久代對(duì)垃圾回收沒有顯著影響,但是有些應(yīng)用可能動(dòng)態(tài)生成或者調(diào)用一些class,例如Hibernate等, 在這種時(shí)候需要設(shè)置一個(gè)比較大的持久代空間來存放這些運(yùn)行過程中新增的類。持久代大小通過-XX:MaxPermSize=進(jìn)行設(shè)置。Gc的基本概念gc分為full gc 跟 minor gc,當(dāng)每一塊區(qū)滿的時(shí)候都會(huì)引發(fā)gc。Scavenge GC一般情況下,當(dāng)新對(duì)象生成,并且在Eden申請(qǐng)空間失敗時(shí),就觸發(fā)了Scavenge GC,堆Eden區(qū)域進(jìn)行GC,清除非存活對(duì)象,并且把尚且存活的對(duì)象移動(dòng)到Survivor區(qū)。然后整理Survivor的兩個(gè)區(qū)。Full GC對(duì)整個(gè)堆進(jìn)行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此應(yīng)該盡可能減少Full GC。有如下原因可能導(dǎo)致Full GC:Tenured被寫滿Perm域被寫滿System.gc()被顯示調(diào)用上一次GC之后Heap的各域分配策略動(dòng)態(tài)變化