JAVA堆和棧的知識點和細節

目錄

新生代

老年代

Java堆配置參數

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   設置方法區大小,用戶加載類信息之類的區域

 

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