JVM的新生代、老年代、MinorGC、MajorGC(Full GC)

JVM的新生代、老年代、MinorGC、MajorGC

參考資料:

http://blog.csdn.net/flamezyg/article/details/44673951

http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html

http://www.360doc.com/content/12/1023/16/9615799_243296263.shtml

   

    JVM中的堆,一般分爲三大部分:新生代、老年代、永久代:

    一:新生代:主要是用來存放新生的對象。一般佔據堆的1/3空間。由於頻繁創建對象,所以新生代會頻繁觸發MinorGC進行垃圾回收。

         新生代又分爲 Eden區、ServivorFrom、ServivorTo三個區。

         Eden區:Java新對象的出生地(如果新創建的對象佔用內存很大,則直接分配到老年代)。當Eden區內存不夠的時候就會觸發MinorGC,對新生代區進行一次垃圾回收。

         ServivorTo:保留了一次MinorGC過程中的倖存者。

         ServivorFrom:上一次GC的倖存者,作爲這一次GC的被掃描者。

         MinorGC的過程:MinorGC採用複製算法。首先,把Eden和ServivorFrom區域中存活的對象複製到ServicorTo區域(如果有對象的年齡以及達到了老年的標準,則賦值到老年代區),同時把這些對象的年齡+1(如果ServicorTo不夠位置了就放到老年區);然後,清空Eden和ServicorFrom中的對象;最後,ServicorTo和ServicorFrom互換,原ServicorTo成爲下一次GC時的ServicorFrom區。

    

 

 

    二:老年代:主要存放應用程序中生命週期長的內存對象。

    老年代的對象比較穩定,所以MajorGC不會頻繁執行。在進行MajorGC前一般都先進行了一次MinorGC,使得有新生代的對象晉身入老年代,導致空間不夠用時才觸發。當無法找到足夠大的連續空間分配給新創建的較大對象時也會提前觸發一次MajorGC進行垃圾回收騰出空間。

    MajorGC採用標記—清除算法:首先掃描一次所有老年代,標記出存活的對象,然後回收沒有標記的對象。MajorGC的耗時比較長,因爲要掃描再回收。MajorGC會產生內存碎片,爲了減少內存損耗,我們一般需要進行合併或者標記出來方便下次直接分配。

     當老年代也滿了裝不下的時候,就會拋出OOM(Out of Memory)異常。

 

 

    三:永久代

    指內存的永久保存區域,主要存放Class和Meta(元數據)的信息,Class在被加載的時候被放入永久區域. 它和和存放實例的區域不同,GC不會在主程序運行期對永久區域進行清理。所以這也導致了永久代的區域會隨着加載的Class的增多而脹滿,最終拋出OOM異常。

    在Java8中,永久代已經被移除,被一個稱爲“元數據區”(元空間)的區域所取代。

    元空間的本質和永久代類似,都是對JVM規範中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。因此,默認情況下,元空間的大小僅受本地內存限制。類的元數據放入 native memory, 字符串池和類的靜態變量放入java堆中. 這樣可以加載多少類的元數據就不再由MaxPermSize控制, 而由系統的實際可用空間來控制.

    採用元空間而不用永久代的幾點原因:(參考:http://www.cnblogs.com/paddix/p/5309550.html)

  1、爲了解決永久代的OOM問題,元數據和class對象存在永久代中,容易出現性能問題和內存溢出。

  2、類及方法的信息等比較難確定其大小,因此對於永久代的大小指定比較困難,太小容易出現永久代溢出,太大則容易導致老年代溢出(因爲堆空間有限,此消彼長)。

  3、永久代會爲 GC 帶來不必要的複雜度,並且回收效率偏低。

  4、Oracle 可能會將HotSpot 與 JRockit 合二爲一。

 

總結下Minor GC 和Full GC 的觸發條件

Minor GC觸發條件:當Eden區滿時,觸發Minor GC。

Full GC觸發條件:

(1)調用System.gc時,系統建議執行Full GC,但是不必然執行

(2)老年代空間不足

(3)方法去空間不足

(4)通過Minor GC後進入老年代的平均大小大於老年代的可用內存

(5)由Eden區、From Space區向To Space區複製時,對象大小大於To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小於該對象大小

--------------------- 本文來自 逸辰杳 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/YHYR_YCY/article/details/52566105?utm_source=copy

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