目錄
GC方面的知識參考:https://www.cnblogs.com/xiaoxi/p/6486852.html
github:https://github.com/zhangpeibisha
新生代
1.對於新生代來說共分爲三個區域:EDEN、S1、S2三個區域
2.新生代的參數配置:-Xmn 1m -XX:SurvivorRatio=2
2.1參數解釋:-Xmn表示新生代應該有多少的空間 -XX:SurvivorRatio=2表示EDEN、S1、S2區域的比例。
如例子所示:1m = 2x(eden區域的份數)+x+x(survivor區域的分數)因此求出來的數據爲 x = 256k的大小
因此:Eden區域爲:2x = 256*2 = 512k 兩個S區域分別爲:256K的大小
證明:
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1 * 1024 * 1024];
}
[GC [DefNew: 512K->256K(768K), 0.0010949 secs] 512K->377K(20224K), 0.0011182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 768K, used 488K [0x335d0000, 0x336d0000, 0x336d0000)
eden space 512K, 45% used [0x335d0000, 0x3360a2e0, 0x33650000)
from space 256K,100% used [0x33690000, 0x336d0000, 0x336d0000)
to space 256K, 0% used [0x33650000, 0x33650000, 0x33690000)
tenured generation total 19456K, used 10361K[0x336d0000, 0x349d0000, 0x349d0000)
the space 19456K, 53% used [0x336d0000, 0x340ee730, 0x340ee800, 0x349d0000)
compacting perm gen total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)
the space 12288K, 1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)
ro space 10240K, 45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)
rw space 12288K, 54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)
因此:總的新生區爲:1M 可用新生區爲:1M-256K(其中一個S區需要保持爲空)
3.新生代的GC策略:
1.在Eden區域申請內存,如果內存充足,則直接生成對象
2.如果內存不足,則發起一次MInor GC進行回收對象,然後將存活的對象複製到空的S區,並且將另外個S區的存活對象複製到空的S區,將年齡足夠的對象放入老年代。此時再將申請內存的對象放入到Eden區。
3.如果內存不足,則將放入老年區。
4.如果老年區內存也不足,則觸發FULL GC來進行全局回收垃圾對像,然後將申請內存的對象放入老年區
5.如果內存還不夠放下該對象,則再次進行回收對象,若這次還不能放下該對象則拋出OOM異常。
老年代
存放經過指定回收次數的對象,或者爲大對象
其他參數:
配置參數: -XX:MaxTenuringThreshold=0 -XX:MaxPermSize=16m
-XX:MaxTenuringThreshold=0 設置年齡大小。當對象經歷過多少次後進入老年代
-XX:MaxPermSize=16m 設置方法區大小,用戶加載類信息之類的區域