jstat -gccause pid 1 每格1毫秒輸出結果
jstat -gccause pid 2000 每格2秒輸出結果
不斷的在屏幕打印出結果
java
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC |
正好對應JVM 的內存分代算法
圖中參數含義以下:
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 — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒) 服務器
1、相關概念多線程
基本回收算法併發
分代垃圾回收詳述app
如上圖所示,爲Java堆中的各代分佈。性能
GC類型
GC有兩種類型:Scavenge GC和Full GC。測試
2、垃圾回收器優化
目前的收集器主要有三種:串行收集器、並行收集器、併發收集器。spa
使用單線程處理全部垃圾回收工做,由於無需多線程交互,因此效率比較高。可是,也沒法使用多處理器的優點,因此此收集器適合單處理器機器。固然,此收集器也能夠用在小數據量(100M左右)狀況下的多處理器機器上。可使用-XX:+UseSerialGC打開。
並行收集器
對年輕代進行並行垃圾回收,所以能夠減小垃圾回收時間。通常在多線程多處理器機器上使用。使用-XX:+UseParallelGC.打開。並行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中進行了加強--能夠堆年老代進行並行收集。若是年老代不使用併發收集的話,是使用單線程進行垃圾回收,所以會制約擴展能力。使用-XX:+UseParallelOldGC打開。
1. 使用-XX:ParallelGCThreads=設置並行垃圾回收的線程數。此值能夠設置與機器處理器數量相等。
2. 此收集器能夠進行以下配置:
§ 最大垃圾回收暫停:指定垃圾回收時的最長暫停時間,經過-XX:MaxGCPauseMillis=指定。爲毫秒.若是指定了此值的話,堆大小和垃圾回收相關參數會進行調整以達到指定值。設定此值可能會減小應用的吞吐量。
§ 吞吐量:吞吐量爲垃圾回收時間與非垃圾回收時間的比值,經過-XX:GCTimeRatio=來設定,公式爲1/(1+N)。例如,-XX:GCTimeRatio=19時,表示5%的時間用於垃圾回收。默認狀況爲99,即1%的時間用於垃圾回收。
併發收集器能夠保證大部分工做都併發進行(應用不中止),垃圾回收只暫停不多的時間,此收集器適合對響應時間要求比較高的中、大規模應用。使用-XX:+UseConcMarkSweepGC打開。
1. 並 發收集器主要減小年老代的暫停時間,他在應用不中止的狀況下使用獨立的垃圾回收線程,跟蹤可達對象。在每一個年老代垃圾回收週期中,在收集初期併發收集器會 對整個應用進行簡短的暫停,在收集中還會再暫停一次。第二次暫停會比第一次稍長,在此過程當中多個線程同時進行垃圾回收工做。
2. 併發收集器使用處理器換來短暫的停頓時間。在一個N個處理器的系統上,併發收集部分使用K/N個可用處理器進行回收,通常狀況下1<=K<=N/4。
3. 在只有一個處理器的主機上使用併發收集器,設置爲incremental mode模式也可得到較短的停頓時間。
4. 浮動垃圾:因爲在應用運行的同時進行垃圾回收,因此有些垃圾可能在垃圾回收進行完成時產生,這樣就形成了「Floating Garbage」,這些垃圾須要在下次垃圾回收週期時才能回收掉。因此,併發收集器通常須要20%的預留空間用於這些浮動垃圾。
5. Concurrent Mode Failure:併發收集器在應用運行時進行收集,因此須要保證堆在垃圾回收的這段時間有足夠的空間供程序使用,不然,垃圾回收還未完成,堆空間先滿了。這種狀況下將會發生「併發模式失敗」,此時整個應用將會暫停,進行垃圾回收。
6. 啓動併發收集器:由於併發收集在應用運行時進行收集,因此必須保證收集完成以前有足夠的內存空間供程序使用,不然會出現「Concurrent Mode Failure」。經過設置-XX:CMSInitiatingOccupancyFraction=指定還有多少剩餘堆時開始執行併發收集
2. 小結
o 串行處理器:
--適用狀況:數據量比較小(100M左右);單處理器下而且對響應時間無要求的應用。
--缺點:只能用於小型應用
o 並行處理器:
--適用狀況:「對吞吐量有高要求」,多CPU、對應用響應時間無要求的中、大型應用。舉例:後臺處理、科學計算。
--缺點:應用響應時間可能較長
o 併發處理器:
--適用狀況:「對響應時間有高要求」,多CPU、對應用響應時間有較高要求的中、大型應用。舉例:Web服務器/應用服務器、電信交換、集成開發環境。
3、常見配置舉例
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
4、調優總結
減小年輕代和年老代花費的時間,通常會提升應用的效率