轉載請註明出處,多謝。
這些變化J2SE5.0開始有效。(同樣適用於java6)
1
在server-class機器(至少2個CPU同時至少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%。這對於服務器應用是個好的選擇。值太大會引起堆大小增長到最大值。
建議策略
不要選擇堆的最大值,除非你知道你的堆比默認最大值大。選擇吞吐量對於你的應用足夠了。
在理想情況,堆會增長到一個值(比最大值小)來支持選擇的吞吐量。
如果堆漲到最大值,吞吐量不還沒有達到。儘可能大的設置堆,但是不要大於物理內存;再執行應用,如果吞吐量仍然不能達到,它對於可用內存(譯者:需要加內存了)過高了。
如果吞吐量可以達到,但是暫停時間太長,設置一個暫停時間目標。這很可能意味着你的吞吐量目標達不到了,所以暫停時間值應該是可以讓應用達到一個合適的平衡。