JVM調優策略

z1340954953發表於2018-04-18

GC的兩種型別

1. 新生代GC(Minor GC):指的是新生代中發生的垃圾回收,因為新生代中的物件建立和銷燬都比較快,頻繁,所以新生代的Minor GC發生很頻繁,如果新生代中出現了FULL GC,一般是由於記憶體擔保失敗(新生代的存活的物件無法移動到老年代中)導致的

2. 老年代GC(Major GC/FULL GC):指的是老年代中發生的垃圾回收,一般伴隨著一次Minor GC,而且FULL GC比Minor GC慢10倍以上

如何去調優

根據java Performance裡面的記憶體設定策略:


具體來說:

1. 整個java堆的大小設定為full gc後老年代使用的記憶體空間大小的3-4倍

2. 永久代記憶體空間大小設定為1.2-1.5倍full GC後永久代使用的空間大小

3. 新生代大小設定為full GC後1-1.5倍老年代使用的記憶體空間大小

4. 老年代大小設定為full GC後2-3倍老年代使用的記憶體空間大小

note:

1. sun官方建議新生代佔有java堆大小為3/8左右

2. java 堆 = 新生代+老年代 ,永久代的記憶體大小不算到java堆中

如果去確定full gc後老年代使用空間?

1. 觀察gc日誌,找出多次FULL GC後,老年代使用記憶體情況,取平均值

2. 藉助工具,強制觸發 FULL GC

強制觸發:

使用jmap工具可觸發FullGC 
jmap -dump:live,format=b,file=heap.bin <pid> 將當前的存活物件dump到檔案,此時會觸發FullGC

jmap -histo:live <pid> 列印每個class的例項數目,記憶體佔用,類全名資訊.live子引數加上後,只統計活的物件數量. 此時會觸發FullGC

後面藉助jmap -heap <pid> 檢視記憶體使用情況(建議查gc日誌更準確),找出老年代大小進行調優

總結:

 在記憶體相對緊張的情況下,可以按照上述的方式來進行記憶體的調優, 找到一個在GC頻率和GC耗時上都可接受的一個記憶體設定,可以用較小的記憶體滿足當前的服務需要

但當記憶體相對寬裕的時候,可以相對給服務多增加一點記憶體,可以減少GC的頻率,GC的耗時相應會增加一些。 一般要求低延時的可以考慮多設定一點記憶體, 對延時要求不高的,可以按照上述方式設定較小記憶體。 

實踐開始,入手一個gc日誌

Full GC 
[PSYoungGen: 34816K->34335K(68608K)] 
[ParOldGen: 204692K->204692K(204800K)] 239508K->239028K(273408K) 
[PSPermGen: 17992K->17992K(21504K)], 0.5403820 secs] 
[Times: user=5.01 sys=0.02, real=0.54 secs] 

可以設定:

-Xms:613M
-Xmx:820M
-XX:PerSize=27M
-XX:MaxPermSize=33M
-Xmn:205M

轉載自:https://www.dutycode.com/jvm_xmx_xmn_xms_shezhi.html


相關文章