Full GC會不會回收年輕代討論

最近在看JVM相關的資料的時候提到了一個空間分配擔保的問題,大體意思就是:

在1.6 update24之前,在發生minor GC前虛擬機會檢查老年代最大的可用的連續空間是否大於年輕代所有對象的總和,弱國這個條件成立,則MinorGC是安全的。如果不成立,則虛擬機查看HandlePronotionFailure是否設置允許擔保失敗,如果允許則繼續檢查老年代最大的連續可用空間是否大於歷次進入來年代對象的平均大小,如果大於,則嘗試MinorGC。如果不滿足上面任何一個條件則Full
GC。

但是1.6 update24之後 HandelPromotionFailure已經失效,放棄。但是還是有一點困惑。上代碼。

public class Demo {


//  JVM 參數
//  -XX:+PrintGC 
//  -XX:+PrintGCDetails
//  -Xms20m
//  -Xmn10m
//  -Xmx20m
//  -XX:+UseSerialGC
//  -XX:MaxTenuringThreshold=15
//  -XX:-HandlePromotionFailure
//  -XX:+PrintHeapAtGC
    public static void main(String[]args)
    {

        byte []a =new byte[6*1024*1024];
        byte []a1 =new byte[5*1024*1024];
        a1=null;
        byte []a2 =new byte[4*1024*1024];   
    }

}

在a1分配時會出發Minor GC。在a2分配時,發現Young空間不足,按照上面步驟檢查,發現Old區剩餘空間不足,且每次進入Old區空間的對象大小大於剩餘空間。出發Full GC。
問題來了,出發Full GC後年輕代的a1是怎麼被回收的?
下面貼出日誌

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option HandlePromotionFailure; support was removed in 6.0_24
{Heap before GC invocations=0 (full 0):
 def new generation   total 9216K, used 6815K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
  eden space 8192K,  83% used [0x00000000f9a00000, 0x00000000fa0a7e38, 0x00000000fa200000)
  from space 1024K,   0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000)
  to   space 1024K,   0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000)
 tenured generation   total 10240K, used 0K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
   the space 10240K,   0% used [0x00000000fa400000, 0x00000000fa400000, 0x00000000fa400200, 0x00000000fae00000)
 compacting perm gen  total 21248K, used 2708K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
   the space 21248K,  12% used [0x00000000fae00000, 0x00000000fb0a51d0, 0x00000000fb0a5200, 0x00000000fc2c0000)
No shared spaces configured.
[GC[DefNew: 6815K->475K(9216K), 0.0052078 secs] 6815K->6619K(19456K), 0.0052389 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap after GC invocations=1 (full 0):
 def new generation   total 9216K, used 475K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
  eden space 8192K,   0% used [0x00000000f9a00000, 0x00000000f9a00000, 0x00000000fa200000)
  from space 1024K,  46% used [0x00000000fa300000, 0x00000000fa376d90, 0x00000000fa400000)
  to   space 1024K,   0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000)
 tenured generation   total 10240K, used 6144K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
   the space 10240K,  60% used [0x00000000fa400000, 0x00000000faa00010, 0x00000000faa00200, 0x00000000fae00000)
 compacting perm gen  total 21248K, used 2708K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
   the space 21248K,  12% used [0x00000000fae00000, 0x00000000fb0a51d0, 0x00000000fb0a5200, 0x00000000fc2c0000)
No shared spaces configured.
}
{Heap before GC invocations=1 (full 0):
 def new generation   total 9216K, used 5923K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
  eden space 8192K,  66% used [0x00000000f9a00000, 0x00000000f9f51f88, 0x00000000fa200000)
  from space 1024K,  46% used [0x00000000fa300000, 0x00000000fa376d90, 0x00000000fa400000)
  to   space 1024K,   0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000)
 tenured generation   total 10240K, used 6144K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
   the space 10240K,  60% used [0x00000000fa400000, 0x00000000faa00010, 0x00000000faa00200, 0x00000000fae00000)
 compacting perm gen  total 21248K, used 2711K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
   the space 21248K,  12% used [0x00000000fae00000, 0x00000000fb0a5d58, 0x00000000fb0a5e00, 0x00000000fc2c0000)
No shared spaces configured.
//GC日誌,DefNew回收前後沒有變化
[GC[DefNew: 5923K->5923K(9216K), 0.0000090 secs][Tenured: 6144K->6616K(10240K), 0.0037974 secs] 12067K->6616K(19456K), [Perm : 2711K->2711K(21248K)], 0.0038378 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap after GC invocations=2 (full 1):
//GC後年輕代 使用爲0
 def new generation   total 9216K, used 0K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
  eden space 8192K,   0% used [0x00000000f9a00000, 0x00000000f9a00000, 0x00000000fa200000)
  from space 1024K,   0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000)
  to   space 1024K,   0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000)
 tenured generation   total 10240K, used 6616K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
   the space 10240K,  64% used [0x00000000fa400000, 0x00000000faa76290, 0x00000000faa76400, 0x00000000fae00000)
 compacting perm gen  total 21248K, used 2711K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
   the space 21248K,  12% used [0x00000000fae00000, 0x00000000fb0a5d58, 0x00000000fb0a5e00, 0x00000000fc2c0000)
No shared spaces configured.
}

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option HandlePromotionFailure; support was removed in 6.0_24
驗證了HandelPromotionFailure已經不被支持了。

最後一次FullGC後從GC的日誌上來看,年輕代的a1並沒有被清除,但是FullGC後的堆信息顯示,a1被清除了,Young取使用空間爲0.

請教a1是怎麼被清除的?實在很困擾

發佈了48 篇原創文章 · 獲贊 104 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章