jvm垃圾回收——功效學

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

轉載請註明出處,多謝。

 

這些變化J2SE5.0開始有效。(同樣適用於java6

1       

server-class機器(至少2CPU同時至少2G物理內存)上運行serverVM模式,回收器自動從串行(-XX:+UseSerialGC) 變成並行(-XX:+UseParallelGC)。你也可以通過命令行-XX:+UseSerialGC改回來。

2       

server-class機器上使用並行GC,無論client或者server模式,初始堆大小和最大堆大小如下變化:

初始堆大小:

大於1/64物理內存或者合理的最小值(Larger of 1/64th of the machine's physical memory on the machine or some reasonable minimum.)在J2SE 5.0z之前默認初始堆大小是合理的最小值,並且不同平臺值不同。可以用-Xms改動。

堆最大值:

小於1/4物理內存或者1GB。在J2ES 5.0之前默認只是64MB。你可以用-Xmx改動。

 

注意:邊界值和分數值在J2SE5.0適用。很可能在以後的版本中不同,由於計算機變得更強大。

3       

平行垃圾回收器(UseParallelGC) 拋出out-of-memory異常,如果在小數量堆上收集而花費過多的時間。爲了避免異常,你可以增加堆大小。你也可以設置參數-XX:GCTimeLimit=time-limit-XX:GCHeapFreeLimit=space-limit :(譯者:到達限制會拋出oom

 

time-limit:垃圾回收時間佔整體時間的上限百分比(默認98)

space-limit:可用區域佔堆最大值的百分比(默認2

4       

-XX:+UseAdaptiveSizePolicy-XX:+UseParallelGC收集器下默認使用,已經變成考慮一下三個目標:

1最大GC暫停時間需求

2應用吞吐量目標需求

3最小覆蓋(foorprint)

按照一下順序:

1如果GC暫停時間大於暫停目標,減少代大小完成目標。

2如果暫停時間合適,考慮應用吞吐目標。如果應用吞吐量目標不合適,增加代大小,完成目標。

3如果以上都合適,減少代大小,來減少GC所需的覆蓋面(foorprint)

標記

-XX:MaxGCPauseMillis=nnn

告訴虛擬機需要nnn毫秒或者以下的暫停時間。VM將會調正堆大小和其他GC相關參數,試圖保持GC觸發(GC-induced)暫停時間比nnn毫秒短。注意,這可能引起VM減少吞吐量,在某些情況下,VM不能滿足暫停時間需要。

默認沒有暫停時間目標。如何很好的滿足暫停時間目標有一定的侷限性。GC暫停時間依賴於堆中活着對象的數量,次GC和主GC的依賴方式也不同。所以小心使用這個參數。太小的值可能引起系統花費大量時間再GC上。

 

-XX:GCTimeRatio=nnn

告訴虛擬機回收器花費的時間,不要超過應用執行時間的1/1+nnn)。例如-XX:GCTimeRatio=19是設置GC時間是整個時間的5%,吞吐量是95%。應用時間是垃圾回收的19倍。

默認值是99,意味着應用至少是垃圾回收的99倍。也就是,垃圾回收不要超過整體時間的1%。這對於服務器應用是個好的選擇。值太大會引起堆大小增長到最大值。

建議策略

不要選擇堆的最大值,除非你知道你的堆比默認最大值大。選擇吞吐量對於你的應用足夠了。

 

在理想情況,堆會增長到一個值(比最大值小)來支持選擇的吞吐量。

 

如果堆漲到最大值,吞吐量不還沒有達到。儘可能大的設置堆,但是不要大於物理內存;再執行應用,如果吞吐量仍然不能達到,它對於可用內存(譯者:需要加內存了)過高了。

 

如果吞吐量可以達到,但是暫停時間太長,設置一個暫停時間目標。這很可能意味着你的吞吐量目標達不到了,所以暫停時間值應該是可以讓應用達到一個合適的平衡。

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