jstat工具特別強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。
執行: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 java)
分代概念:
分代是Java垃圾收集的一大亮點,根據對象的生命周期長短,把堆分為3個代:Young,Old和Permanent,根據不同代的特點采用不同的收集算法,揚長避短也。
Young(Nursery),年輕代。研究表明大部分對象都是朝生暮死,隨生隨滅的。因此所有收集器都為年輕代選擇了復制算法。
復制算法優點是只訪問活躍對象,缺點是復制成本高。因為年輕代只有少量的對象能熬到垃圾收集,因此只需少量的復制成本。而且復制收集器只訪問活躍對象,對那些占了最大比率的死對象視而不見,充分發揮了它遍歷空間成本低的優點。
Young(年輕代)
年 輕代分三個區。一個Eden區,兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被復制到Survivor區 (兩個中的一個),當這個Survivor區滿時,此區的存活對象將被復制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一 個Survivor區復制過來的並且此時還存活的對象,將被復制“年老區(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先后關 系,所以同一個區中可能同時存在從Eden復制過來 對象,和從前一個Survivor復制過來的對象,而復制到年老區的只有從第一個Survivor去過來的對象。而且,Survivor區總有一個是空 的。
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的各域分配策略動態變化