JDK8垃圾回收調優指南--(2)人機工程

原文:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide--Ergonomics

人機工程學是通過Java虛擬機(JVM)和垃圾收集調優(如基於行爲的調優)提高應用程序性能的過程。

  1. JVM爲垃圾收集器、堆大小和運行時編譯器提供了與平臺相關的默認選擇。這些選擇匹配不同類型應用程序的需要,同時需要較少的命令行調優。
  2. 此外,基於行爲的調優動態地調整堆的大小,以滿足應用程序的特定行爲。

此部分描述這些默認選擇和基於行爲的調優。在使用後面幾節中描述的更詳細的操控之前,先使用這些默認值。

垃圾收集器, 堆, 運行時編譯器的默認選項(JVM提供,平臺相關)

被稱爲服務器的一類機器:

  • 至少2個物理處理器
  • 至少2GB的物理內存

在服務器上,默認的選項是:

  • 並行垃圾收集器(吞吐量收集器)
  • 堆內存的初始大小爲物理內存的1/64,最大1GB
  • 最大的堆內存大小爲物理內存的1/4,最大1GB
  • 服務器運行時編譯器

對於64位系統的初始及最大的堆大小,參見“並行收集器”中的默認堆大小

服務器類機器的定義適用於所有平臺,但運行Windows操作系統版本的32位平臺除外。表2-1,“默認運行時編譯器”展示了不同平臺的選擇:

Default Runtime Compiler

腳註1:Client表示客戶端運行時編譯器,Server表示服務端運行時編譯器。

腳註2:即使在服務器類機器上,也選擇該策略來使用客戶機運行時編譯器。之所以做出這樣的選擇,是因爲歷史上客戶機應用程序(例如,交互應用程序)在這種平臺和操作系統的組合上運行得更頻繁。

腳註3:只支持服務器運行時編譯器。

基於行爲調優

對於並行收集器,Java SE爲了實現應用程序指定行爲提供了兩個垃圾收集調優參數:最大暫停時間目標和應用程序吞吐量目標;參見並行垃圾收集器。應用程序需要一個足夠大的堆,至少可以容納所有存活的數據。此外,最小堆大小可能會妨礙達到這些期望的目標。

Maximum Pause Time Goal

暫停時間(GC停頓)是指垃圾收集器(回收時)停止應用程序並恢復不再使用的空間的持續時間。最大暫停時間目標主要是爲了限制停頓時間不要太長。暫停的平均時間和該平均時間上的方差由垃圾收集器維護。平均值是從執行開始時開始計算的,但是要進行加權,最近的暫停次數更重要。如果平均值加上暫停時間的方差大於最大暫停時間目標,則垃圾收集器認爲目標沒有達到。

最大暫停時間目標通過命令行'-XX:MaxGCPauseMillis=<nnn>'配置。這被解釋爲給垃圾收集器的一個提示,即需要<nnn>毫秒或更少的暫停時間。垃圾收集器將調整Java堆大小和其它與垃圾收集相關的參數,以使垃圾收集暫停時間小於<nnn>毫秒。默認情況下,沒有最大暫停時間目標。這些調整可能會導致垃圾收集器更頻繁地發生,從而降低應用程序的總體吞吐量。垃圾收集器嘗試在吞吐量目標之前滿足任何暫停時間目標(優先級:最大暫停時間>總體吞吐量)。然而,在某些情況下,期望的暫停時間目標無法實現。

Throughput Goal

吞吐量目標是根據垃圾回收的時間和垃圾回收之外的時間(稱爲應用程序時間)來度量的。這個目標通過命令行'-XX:GCTimeRatio=<nnn>'配置。垃圾收集時間與總時間(GC時間+應用程序時間)之比爲1/(1 + <nnn>)(此處注意,原文:“The ratio of garbage collection time to application time is 1/(1+<nnn>)”中爲GC時間與應用時間之比爲1/(1+<nnn>))。例如,'-XX:GCTimeRatio=19'將總時間的1/20或5%設置爲垃圾收集的目標。

花費在垃圾收集上的時間是年輕代和老年代收集時間之和。如果吞吐量的目標沒有達到,則增加代(年輕代、老年代)的大小來企圖增加應用在多次回收之間的運行時間(連續2次回收的間隔)。

Footprint Goal

如果最大暫停時間和吞吐量目標已經滿足,那麼垃圾收集器將減少堆的大小,直到其中一個目標(始終是吞吐量目標)無法滿足爲止。沒有達到的目標將被處理。

調節策略

不要爲堆設定最大值,除非您知道需要一個比默認最大堆大小更大的堆值。選擇一個足以滿足您的應用程序的吞吐量目標。

堆將增長或收縮到支持所選吞吐量目標的大小。應用程序行爲的更改可能導致堆增長或收縮。例如,如果應用程序開始以更高的速度分配,堆將會增長以保持相同的吞吐量(如果不相應增加堆的大小,會導致GC更加頻繁,吞吐量下降)。

如果堆增長到最大值,而吞吐量目標沒有得到滿足,那麼對於吞吐量目標來說,最大堆值太小。將最大堆值設置爲接近平臺上物理內存總量,但不會導致應用程序交換的值。再次執行應用程序。如果吞吐量目標仍然沒有達到,那麼吞吐量目標對於平臺上的可用內存來說太高了。

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

當垃圾收集器試圖滿足競爭目標時,堆的大小通常會振盪。即使應用程序已經達到穩定狀態,也是如此。實現吞吐量目標(可能需要更大的堆)的壓力與實現最大暫停時間和最小佔用空間(兩者都可能需要小堆)的目標相競爭。

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