GC調優簡介

GC 調優簡介

GC就是垃圾回收,垃圾回收有三個重要的指標:


  • 吞吐量:衡量垃圾回收器運行在性能峯值的時候不需要關心垃圾回收器暫-停的時間或者需要佔用內存的能力。
  • 延遲:衡量垃圾回收器最小化甚至消滅由垃圾回收器引起的暫停時間和應用抖動的能力。
  • 內存佔用:衡量爲了高效的運行,垃圾回收器需要的內存。

一項指標的提升,往往需要犧牲其他一項或者兩項指標。換一句話說,一項指標的妥協通常是爲了支持提升其他一項或者兩項指標。然而,對於大多數應用來說,很少有3項指標都非常重要,通常,一項或者兩項比其他的更重要。
由於始終需要各種權衡,那麼知道哪項指標對應用是最有必要的就顯得非常重要。

GC原則

在優化JVM垃圾回收器的時候,有3項基本原則
- 在minor垃圾回收器中,最大量的對象被回收,這個被稱爲Minor GC回收原則。秉承這個原則可以減少由應用產生的full垃圾回收數量和頻率,Full垃圾回收往往需要更長的時間,以致於應用無法達到延遲和吞吐量的需求。
- 更多的內存分配給垃圾回收器,也就是說更大的Java堆空間,垃圾回收器和應用在吞吐量和延遲上會表現得更好,這條原則被稱爲GC最大內存原則
- 優化JVM垃圾回收器的3個指標中的2個,這個被稱爲2/3 GC優化原則
在進行優化JVM垃圾回收器的時候, 牢牢記住這三條原則會讓你的優化任務更容易完成。

GC的分類

針對HotSpot VM的實現,它裏面的GC其實準確分類只有兩大種:

Partial GC:並不收集整個GC堆的模式

Young GC(Minor GC):只收集young gen的GC
Old GC:只收集old gen的GC。只有CMS的concurrent collection是這個模式
Mixed GC:收集整個young gen以及部分old gen的GC。只有G1有這個模式

Full GC:收集整個堆,包括young gen、old gen、perm gen(如果存在的話)等所有部分的模式。

Major GC通常是跟full GC是等價的,收集整個GC堆。但因爲HotSpot VM發展了這麼多年,外界對各種名詞的解讀已經完全混亂了,當有人說“major GC”的時候一定要問清楚他想要指的是上面的full GC還是old gen。

java服務或者web GC調優

參數簡介和日誌詳解

首先大家要先了解,java啓動參數,如果不瞭解可以在看之前的章節-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -
XX:MaxPermSize=256m -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -Xloggc:./gclogs

-Xss —線程堆棧大小,一般用於存放方法入口參數和返回值,以及原子類型的本地變量(即方法內部變量);一般可設置爲128k.
-Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆 棧大小爲1M,以前每個線程堆棧大小爲256K
-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前後打印出堆的信息
-Xloggc:../logs/gc.log 日誌文件的輸出路徑
-XX:+PrintCommandLineFlags 打印出在HotSpot VM初始化的時候選擇的初始值和最大值比如-XX:InitialHeapSize= -XX:MaxHeapSize=,這裏n表示初始化的java堆大小值,m表示java堆的最大值。

JDK 1.7 默認啓動的時候,新生代採用ParallelGC和老年代採用ParallelOldGC。

2017-08-23T16:38:24.535+0800: 120.419: [GC2017-08-23T16:38:24.535+0800: 120.420: [PSYoungGen: 620234K->62626K(645120K), 0.0543480 secs] 912910K->355303K(2025472K), 0.0551220 secs] [Times: user=0.21 sys=0.00, real=0.05 secs]
詳解:【YoungGC發生的時間,PSYoungGen 代表新生代用的是ParallelGC,依次是年輕代垃圾回收前的大小 - 年輕代垃圾回收後的大小(新生代總大小),
回收時間】 堆區垃圾回收前的大小 - 堆區垃圾回收後的大小(堆總大小),回收時間【time :GC用戶耗時,系統耗時,實際耗時】
2017-08-23T16:38:24.835+0800: 121.465: [Full GC [PSYoungGen: 1235K->0K(18944K)] [ParOldGen: 27896K->11293K(27136K)] 29131K->11293K(46080K) [PSPermGen: 38241K->38238K(40960K)], 0.3168340 secs] [Times: user=0.77 sys=0.01, real=0.32 secs]
詳解:【FullGC比YoungGC,多了老年代和永久區的回收,跟上面大致一樣,回收前,回收後,總大小,這裏就不在囉嗦。】

jvm一步步優化,詳細介紹了,應用堆初始化大小該如何設置,以及在吞吐量,延時,內存佔用3個指標中如何取捨
CMS GC詳解,請參考這篇文章,寫得非常詳細

下面的一些jvm的參數,他們的默認值一般比較容易忽略,記錄下來,方便查詢
-Xms 默認情況下堆內存的64分之一
-Xmx 默認情況下對內存的4分之一
-Xmn 默認情況下堆內存的64分之一
-XX:NewRatio 默認爲2
-XX:SurvivorRatio 默認爲8

在linux 環境下,可以使用jmap -heap pid 查看某個應用的內存佔用情況,結果如下:

using thread-local object allocation.
Parallel GC with 4 thread(s) //GC 方式 Heap Configuration: //堆內存初始化配置
MinHeapFreeRatio=40 //對應jvm啓動參數-XX:MinHeapFreeRatio設置JVM堆最小空閒比率(default 40)
MaxHeapFreeRatio=70 //對應jvm啓動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閒比率(default 70)
MaxHeapSize=512.0MB //對應jvm啓動參數-XX:MaxHeapSize=設置JVM堆的最大大小
NewSize = 1.0MB //對應jvm啓動參數-XX:NewSize=設置JVM堆的‘新生代’的默認大小
MaxNewSize =4095MB //對應jvm啓動參數-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
OldSize = 4.0MB //對應jvm啓動參數-XX:OldSize=:設置JVM堆的‘老生代’的大小
NewRatio = 8 //對應jvm啓動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //對應jvm啓動參數-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值
PermSize= 16.0MB //對應jvm啓動參數-XX:PermSize=:設置JVM堆的‘永生代’的初始大小
MaxPermSize=64.0MB //對應jvm啓動參數-XX:MaxPermSize=:設置JVM堆的‘永生代’的最大大小

      Heap Usage:               //堆內存分步
      PS Young Generation
      Eden Space:          //Eden區內存分佈
        capacity = 20381696 (19.4375MB)  //Eden區總容量
        used     = 20370032 (19.426376342773438MB)  //Eden區已使用
        free     = 11664 (0.0111236572265625MB)  //Eden區剩餘容量
        99.94277218147106% used  //Eden區使用比率
     From Space:        //其中一個Survivor區的內存分佈
         capacity = 8519680 (8.125MB)
         used     = 32768 (0.03125MB)
         free     = 8486912 (8.09375MB)
         0.38461538461538464% used
    To Space:            //另一個Survivor區的內存分佈
        capacity = 9306112 (8.875MB)
        used     = 0 (0.0MB)
        free     = 9306112 (8.875MB)
        0.0% used
    PS Old Generation  //當前的Old區內存分佈
        capacity = 366280704 (349.3125MB)
        used     = 322179848 (307.25464630126953MB)
        free     = 44100856 (42.05785369873047MB)
        87.95982001825573% used
    PS Perm Generation  //當前的 “永生代” 內存分佈
        capacity = 32243712 (30.75MB)
        used     = 28918584 (27.57891082763672MB)
        free     = 3325128 (3.1710891723632812MB)
        89.68751488662348% used
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章