翻譯:Java GC 調優(二) 調優參數說明

    JVM爲垃圾收集器(GC)、堆(Heap)大小和運行時編譯器(Runtime Compiler)提供了與平臺相關的默認參數。這些參數符合不同類型應用程序的需求,同時調優時只需要輸入較少的命令。此外,基於行爲的調優可以動態優化堆的大小,以滿足應用程序的特定行爲。

默認參數

比較重要的垃圾收集器,堆大小,編譯器默認參數:

    1.GC:garbage first (G1)收集器

    2.線程數:GC線程的最大數量受到堆大小和可用CPU資源的限制

    3.初始堆大小:初始堆大小爲物理內存的1/64

    4.最大堆大小:最大堆大小爲物理內存的1/4

    5.編譯器:使用C1和C2的分層編譯器(啓動時使用C1編譯器模式,一旦程序被適當預熱,使用C2編譯器模式,提供更主動的優化)

基於行爲調優

    通常情況下,垃圾收集器(GC)調優時會從吞吐量優先和暫停時間優先中選擇一種作爲目標。如果滿足了首選目標,收集器將嘗試最大化另一個目標。但很難同時滿足所有的目標:應用程序需要一個最小的堆來容納所有的活動數據,但預期目標還可能受其他配置影響。

暫停時間優先

    暫停時間是垃圾收集器停止應用程序並恢復不再使用的空間的持續時間。暫停時間優先的目標是限制這些暫停的最長時間,提高程序的響應速度。

    垃圾收集器記錄平均暫停時間和平均值上的方差。平均數是從程序執行的開始算起的,但是它被加權了,所以最近的暫停計數權重更高。如果暫停時間的平均值加上方差大於最大暫停時間目標,則垃圾收集器認爲目標沒有被滿足。

    通過命令行選項-XX:MaxGCPauseMillis=<nnn>來指定程序最大暫停時間,垃圾收集器會收到相應的提示:暫停時間爲<nnn>毫秒或者更少。垃圾收集器調整Java堆大小和其他與垃圾收集相關的參數,試圖保持垃圾收集暫停時間小於<nnn>毫秒。最大暫停時間的缺省值因收集器的不同而不同。這些調整可能導致更頻繁地進行垃圾收集,從而降低應用程序的總體吞吐量。在某些情況下,期望的暫停時間目標無法實現。

吞吐量優先

    吞吐量目標是根據收集垃圾所花費的時間來度量的,而花費在垃圾收集之外的時間就是應用程序時間。

    通過指令:-XX:GCTimeRatio=<nnn>指定,垃圾收集時間與應用程序總時間的比例爲1/(1+<nnn>),例如-XX:GCTimeRatio=19表示垃圾回收時間佔比爲1/20,即垃圾回收時間佔程序運行總時間的5%。

    花費在垃圾收集上的時間是所有垃圾收集引起的暫停的總時間。如果吞吐量目標沒有得到滿足,那麼垃圾收集器的一個可能操作是增加堆的大小,這可能導致應用程序最大暫停時間更長。

內存佔用

    如果吞吐量和最大暫停時間目標已經滿足,垃圾收集器會減少堆的大小,直到其中一個目標(通常是吞吐量目標)不能滿足爲止。可以使用-Xms=<nnn>和-Xmx =<mmm>分別指定垃圾收集器可用的最小堆大小和最大堆大小。

調優策略

    根據所選的吞吐量目標,堆大小會增大或收縮直到能滿足目標,瞭解堆調優策略:例如指定最大堆大小和最大暫停時間。

    不要直接指定堆大小爲最大值,除非知道應用程序需要比默認值更大的堆空間:通常選擇指定一個合適的吞吐量,讓GC自行調整堆大小。

    應用程序行爲的變化可能導致堆增大或縮小。例如,程序開始以更高的速率分配內存,爲了維持吞吐量不變,堆會增大。

    如果堆增大到最大大小,而吞吐量目標依然沒有被滿足,那麼最大堆大小對於吞吐量目標來說太小了。將最大堆大小設置爲接近平臺上總的物理內存的值,且不引起不同應用程序在內存中的切換。再次執行應用程序。如果吞吐量目標仍然沒有達到,那麼對於平臺上的可用內存來說,應用程序時間的目標太高了。

    如果吞吐量目標可以滿足,但是暫停時間太長,那麼選擇指定最大暫停時間。選擇最大暫停時間可能意味着無法滿足吞吐量目標,因此選擇對應用程序來說可以接受的折衷值。

    當垃圾收集器試圖滿足相互競爭的目標時,堆的大小通常會發生波動,即使應用程序已經達到穩定狀態。實現吞吐量目標(可能需要更大的堆)需要與最大暫停時間和最小內存佔用(兩者都可能需要較小的堆)的目標競爭。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章