JVM堆記憶體管理與自定義分配引數詳解
堆記憶體模型:
在Java中,堆被劃分成兩個不同的區域:新生代(Young),老年代(Old)。而Permanent屬於永久代(方法區),不屬於堆記憶體。新生代又被分為了三個區域:Eden,from survivor,to survivor。這樣劃分的目的是為了使JVM能夠更好的管理堆記憶體中的物件,包括記憶體分配以及回收。
從圖中可以看出: 堆大小=新生代+老年代,預設的,新生代與老年代的比例為1:2(該值可以通過引數-XX:NewRatio指定),即:新生代=1/3堆空間大小,老年代=2/3堆空間大小,其中新生代被細分為Eden何兩個Survivor區域,這兩個Survivor命名為from和to。預設比例 eden:from:to = 8:1:1,JVM每次只會使用Edem和一塊survivor區域來為物件服務,所以無論何時,總有一塊survivor是空閒的,因此新生代實際使用記憶體空間只有90%的新生代空間。
通常我們會根據實際情況(伺服器記憶體大小)對堆記憶體大小進行調優,記憶體引數含義如下:
-Xmx java虛擬機器堆區記憶體可被分配的最大上限,通常為作業系統可用記憶體的1/4;
-Xms java虛擬機器堆區記憶體初始記憶體分配的大小,通常為作業系統可用記憶體的1/64;
開發過程中,通常會將-Xms 與-Xmx兩個引數的配置相同的值,其目的是為了能夠在java垃圾回收機制清理完堆區後不需要重新分隔計算堆區的大小而浪費資源。
-XX:NewSize 新生代初始記憶體的大小,應該小於-Xms的值;
-XX:NewRatio Yong 和 Old的比例,比如值為2,則Old是Yong的2倍,即Yong Generation佔據記憶體的1/3;
-XX:Maxnewsize Yong的最大值大小;
-Xmn 對 -XX:newSize、-XX:MaxnewSize兩個引數的同時配置,也就是說如果通過-Xmn來配置新生代的記憶體大小,那麼-XX:newSize = -XX:MaxnewSize = -Xmn;
-XX:Surviorratio Eden和一個Suivior的比例,比如值為5,即Eden是To(S2)的比例是5,(From和To是一樣大的),此時Eden佔據Yong Generation的5/7
java虛擬機器對非堆區記憶體配置的兩個引數:
-XX:PermSize 非堆區初始記憶體分配大小(方法區)
-XX:MaxPermSize 對非堆區分配的記憶體的最大上限(方法區)。