原文:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide--Ergonomics。
人機工程學是通過Java虛擬機(JVM)和垃圾收集調優(如基於行爲的調優)提高應用程序性能的過程。
- JVM爲垃圾收集器、堆大小和運行時編譯器提供了與平臺相關的默認選擇。這些選擇匹配不同類型應用程序的需要,同時需要較少的命令行調優。
- 此外,基於行爲的調優動態地調整堆的大小,以滿足應用程序的特定行爲。
此部分描述這些默認選擇和基於行爲的調優。在使用後面幾節中描述的更詳細的操控之前,先使用這些默認值。
垃圾收集器, 堆, 運行時編譯器的默認選項(JVM提供,平臺相關)
被稱爲服務器的一類機器:
- 至少2個物理處理器
- 至少2GB的物理內存
在服務器上,默認的選項是:
- 並行垃圾收集器(吞吐量收集器)
- 堆內存的初始大小爲物理內存的1/64,最大1GB
- 最大的堆內存大小爲物理內存的1/4,最大1GB
- 服務器運行時編譯器
對於64位系統的初始及最大的堆大小,參見“並行收集器”中的默認堆大小。
服務器類機器的定義適用於所有平臺,但運行Windows操作系統版本的32位平臺除外。表2-1,“默認運行時編譯器”展示了不同平臺的選擇:
腳註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更加頻繁,吞吐量下降)。
如果堆增長到最大值,而吞吐量目標沒有得到滿足,那麼對於吞吐量目標來說,最大堆值太小。將最大堆值設置爲接近平臺上物理內存總量,但不會導致應用程序交換的值。再次執行應用程序。如果吞吐量目標仍然沒有達到,那麼吞吐量目標對於平臺上的可用內存來說太高了。
如果吞吐量目標可以實現,但是暫停時間太長,那麼選擇一個最大暫停時間目標。選擇最大暫停時間目標可能意味着您的吞吐量目標將無法滿足,因此選擇對應用程序來說可接受的折中值。
當垃圾收集器試圖滿足競爭目標時,堆的大小通常會振盪。即使應用程序已經達到穩定狀態,也是如此。實現吞吐量目標(可能需要更大的堆)的壓力與實現最大暫停時間和最小佔用空間(兩者都可能需要小堆)的目標相競爭。