1. 程式人生 > >JVM——Minor GC、Major GC和Full GC之間的區別

JVM——Minor GC、Major GC和Full GC之間的區別

1.Minor GC

我們知道,新生代可以分為Eden和Survivor區域,而從新生代代空間(包括 Eden 和 Survivor 區域)回收記憶體則被稱為 Minor GC。可以參考JVM——四種垃圾收集演算法詳解中的標記複製演算法。

2.Major GC vs Full GC

  • Major GC 是清理老年代。但是由於很多MojorGC 是由MinorGC 觸發的,所以有時候很難將MajorGC 和MinorGC區分開。出現了 Major GC,經常會伴隨至少一次的 Minor GC(但非絕對的,ParallelScavenge 收集器的收集策略裡就有直接進行 Major GC 的策略選擇過程) 。MajorGC 的速度一般會比 Minor GC 慢 10倍以上。
  • Full GC 是清理整個堆空間—包括年輕代和老年代。

3.觸發機制

Minor GC觸發機制: 當年輕代滿時就會觸發Minor GC,這裡的年輕代滿指的是Eden代滿,Survivor滿不會引發GC。 
Full GC觸發機制: 

  • 呼叫System.gc時,系統建議執行Full GC(但是不必然執行 )
  • 老年代空間不足 
  • 方法區空間不足 
  • 通過Minor GC後進入老年代的平均大小大於老年代的可用記憶體 
  • 由Eden區、survivor space1(From Space)區向survivor space2(To Space)區複製時,物件大小大於To Space可用記憶體,則把該物件轉存到老年代,且老年代的可用記憶體小於該物件大小
  • 當永久代滿時也會引發Full GC,會導致Class、Method元資訊的解除安裝。 
     

其實Full GC定義是相對明確的,就是針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全域性範圍的GC;Minor GC和Major GC是俗稱,在Hotspot JVM實現的Serial GC, Parallel GC, CMS, G1 GC中大致可以對應到某個Young GC和Old GC演算法組合;
因此,簡單的說,GC的觸發條件就是某GC演算法對應區域滿了,或是預測快滿了。比如,上文說到的,各種Young GC的觸發原因都是eden區滿了。

 

好啦,以上就是關於幾種GC的相關知識總結啦,如果大家有什麼不明白的地方或者發現文中有描述不好的地方,歡迎大家留言評論,我們一起學習呀。

 

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!