Jstat在分析java的內存GC時的應用

jstat工具特別強大,有衆多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。java

執行:cd $JAVA_HOME/bin中執行jstat,注意jstat後必定要跟參數。算法

各個參數的意義。 工具

  •     jstat -class pid:顯示加載class的數量,及所佔空間等信息。 
  •     jstat -compiler pid:顯示VM實時編譯的數量等信息。 
  •     jstat -gc pid:能夠顯示gc的信息,查看gc的次數,及時間。其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。 
  •     jstat -gccapacity:能夠顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存佔用量,PC是但前perm內存佔用量。其餘的能夠根據這個類推, OC是old內純的佔用量。 
  •     jstat -gcnew pid:new對象的信息。 
  •     jstat -gcnewcapacity pid:new對象的信息及其佔用量。 
  •     jstat -gcold pid:old對象的信息。 
  •     jstat -gcoldcapacity pid:old對象的信息及其佔用量。 
  •     jstat -gcpermcapacity pid: perm對象的信息及其佔用量。 
  •     jstat -util pid:統計gc信息統計。 
  •     jstat -printcompilation pid:當前VM執行的信息。 
  •     除了以上一個參數外,還能夠同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,還能夠加上-h3每三行顯示一下標題。
  • 語法結構:   
  • Usage: jstat -help|-options   
  •        jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]   
  • 參數解釋:   
  • Options — 選項,咱們通常使用 -gcutil 查看gc狀況比較多   
  • vmid    — VM的進程號,即當前運行的java進程號   
  • interval– 間隔時間,單位爲秒或者毫秒   
  • count   — 打印次數,若是缺省則打印無數次   
  • S0  — Heap上的 Survivor space 0 區已使用空間的百分比 
  • S1  — Heap上的 Survivor space 1 區已使用空間的百分比 
  • E   — Heap上的 Eden space 區已使用空間的百分比 
  • O   — Heap上的 Old space 區已使用空間的百分比 
  • P   — Perm space 區已使用空間的百分比 
  • YGC — 從應用程序啓動到採樣時發生 Young GC 的次數 
  • YGCT– 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒) 
  • FGC — 從應用程序啓動到採樣時發生 Full GC 的次數 
  • FGCT– 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒) 
  • GCT — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)

如:[root@localhost bin]# jstat -gcutil 25332  1000  10     (25332是java的進程號,ps -ef | grep javaspa

分代概念:對象

分代是Java垃圾收集的一大亮點,根據對象的生命週期長短,把堆分爲3個代:Young,Old和Permanent,根據不一樣代的特色採用不一樣的收集算法,揚長避短也。生命週期

Young(Nursery),年輕代。研究代表大部分對象都是朝生暮死,隨生隨滅的。所以全部收集器都爲年輕代選擇了複製算法。進程

複製算法優勢是隻訪問活躍對象,缺點是複製成本高。由於年輕代只有少許的對象能熬到垃圾收集,所以只需少許的複製成本。並且複製收集器只訪問活躍對象,對那些佔了最大比率的死對象視而不見,充分發揮了它遍歷空間成本低的優勢。內存

Young(年輕代)ci

年 輕代分三個區。一個Eden區,兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區 (兩個中的一個),當這個Survivor區滿時,此區的存活對象將被複制到另一個Survivor區,當這個Survivor去也滿了的時候,從第一 個Survivor區複製過來的而且此時還存活的對象,將被複制「年老區(Tenured)」。須要注意,Survivor的兩個區是對稱的,沒前後關 系,因此同一個區中可能同時存在從Eden複製過來 對象,和從前一個Survivor複製過來的對象,而複製到年老區的只有從第一個Survivor去過來的對象。並且,Survivor區總有一個是空 的。it

Tenured(年老代)

年老代存放從年輕代存活的對象。通常來講年老代存放的都是生命期較長的對象。

Perm(持久代)

用 於存放靜態文件,現在Java類、方法等。持久代對垃圾回收沒有顯著影響,可是有些應用可能動態生成或者調用一些class,例如Hibernate等, 在這種時候須要設置一個比較大的持久代空間來存放這些運行過程當中新增的類。持久代大小經過-XX:MaxPermSize=進行設置。

Gc的基本概念

gc分爲full gc 跟 minor gc,當每一塊區滿的時候都會引起gc。

Scavenge GC

通常狀況下,當新對象生成,而且在Eden申請空間失敗時,就觸發了Scavenge GC,堆Eden區域進行GC,清除非存活對象,而且把尚且存活的對象移動到Survivor區。而後整理Survivor的兩個區。

Full GC

對整個堆進行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,所以應該儘量減小Full GC。有以下緣由可能致使Full GC:

Tenured被寫滿

Perm域被寫滿

System.gc()被顯示調用

上一次GC以後Heap的各域分配策略動態變化

相關文章
相關標籤/搜索