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