JVM GC優化思路

JVM的GC一般分爲Young GC和Full GC,而Full GC由於STW(stop the world)需要消耗的時間一般情況比Young GC要多很多,所以GC優化思路是儘量減少Full GC的頻率,減少STW以提升性能。

現在我們知道了JVM優化的方向是減少Full GC的頻率,要減少Full GC的頻率必然要知道對象是如何進入老年代的。

那麼我們先考慮幾個問題,Young GC、Full GC何時觸發?對象如何進入老年代?

1、Young GC何時觸發?

當新生代Eden區或者Survivor區空間不足時會觸發Young GC。

2、Full GC何時觸發?

1.老年代可用空間小於新生代存活對象所佔空間,如果沒有開啓空間擔保參數直接觸發Full GC。

2.老年代可用空間小於新生代平均進入老年代的大小,提前觸發Full GC。

3.新生代Young GC後的存活對象大於Survivor直接進入老年代,老年代內存不足觸發Full GC。

3、對象如何進入老年代?

1.躲過15次GC,達到15歲高齡之後進入老年代。

2.動態年齡判定規則,如果Survivor區域 年齡1+...+年齡n 對象總和大於Survivor區域的50%,此時年齡n以上的對象會進入老年代,不一定要達到15歲。

3.如果一次Young GC後存活對象太多無法進入Survivor區域,直接進入老年代。

4.大對象直接進入老年代。

4、JVM GC優化

現在我們知道了JVM GC優化的方向是讓對象儘可能的存活在新生代進行Young GC,那麼我們根據第三個問題 對象如何進入老年代 來進行針對性的優化。

JVM年齡和大對象直接進入老年代一般優化係數比較低。

主要優化的是動態年齡判定規則對象超過Survivor區域50%進入老年代和Young GC過後存活對象太多無法進入Survivor區域直接進入老年代這兩種情況。

也就是說一次Young GC過後存活的對象可以放入一個Survivor並且儘量不要大於Survivor的50%。

主要設置的參數是新生代的內存大小以及新生代Eden和Survivor的比例,具體大小需要根據JVM GC日誌情況來具體設計,這些內容不在本篇文章中,後續會有具體分析。

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