MinorGC和FullGC的觸發條件


前言

無論是日常工作,還是企業面試,我們都會經常接觸到GC。我們都知道GC是java中的垃圾回收策略。GC幫我們省去了很多事。在GC中,我經常聽到的就屬於MinorGC和FullGC了。那么在什么情況下才會觸發這兩種GC呢?

MinorGC觸發條件

虛擬機在進行minorGC之前會判斷老年代最大的可用連續空間是否大於新生代的所有對象總空間

    1、如果大於的話,直接執行minorGC

    2、如果小於,判斷是否開啟HandlerPromotionFailure,沒有開啟直接FullGC

    3、如果開啟了HanlerPromotionFailure, JVM會判斷老年代的最大連續內存空間是否大於歷次晉升(晉級老年代對象的平均大小)平均值的大小,如果小於直接執行FullGC

    4、如果大於的話,執行minorGC

對於HandlerPromotionFailure,我們可以這樣理解,在發生Minor GC之前,虛擬機會先檢查老年代的最大的連續內存空間是否大於新生代的所有對象的空間,如果這個條件成立,Minor GC是安全的。如果不成立虛擬機會查看HanlerPromotionFailure 設置值是否允許擔當失敗,如果允許,那么會繼續檢查老年代最大可用的連續內存空間是否大於歷次晉級到老年代對象的平均大小,如果大於就嘗試一次Minor GC, 如果小於,或者HanlerPromotionFailure 不願承擔風險就要進行一次Full GC 。上面的擔保就好比你去買房,要去銀行貸款。如果你的貸款金額比較大,那么一般銀行會需要你提供擔保人。說白了,銀行就是擔心你每個月的工資不夠還貸款。這里的老年代就相當於你的擔保人。如果你的擔保人的每個月的收入都不夠你的月供。那銀行肯定不會貸款給你的。在jvm中就是肯定會直接執行Full GC了。(強行比喻一番,能理解就好。。)

FullGC觸發條件

  • 老年代空間不足

     如果創建一個大對象,Eden區域當中放不下這個大對象,會直接保存在老年代當中,如果老年代空間也不足,就會觸發Full GC。為了避免這種情況,最好就是不要創建太大的對象。

  • 持久代空間不足

    如果有持久代空間的話,系統當中需要加載的類,調用的方法很多,同時持久代當中沒有足夠的空間,就出觸發一次Full GC

  • YGC出現promotion failure

    promotion failure發生在Young GC, 如果Survivor區當中存活對象的年齡達到了設定值,會就將Survivor區當中的對象拷貝到老年代,如果老年代的空間不足,就會發生promotion failure, 接下去就會發生Full GC.

  • 統計YGC發生時晉升到老年代的平均總大小大於老年代的空閑空間

      在發生YGC是會判斷,是否安全,這里的安全指的是,當前老年代空間可以容納YGC晉升的對象的平均大小,如果不安全,就不會執行YGC,轉而執行FullGC。

  • 顯示調用System.gc

這里調用了 System.gc  並不一定會立馬就觸發FullGC

總結

這里簡單的總結了MinorGC和FullGC的觸發條件。便於加深對JVM中GC的理解。

原文鏈接:https://blog.csdn.net/summerZBH123/article/details/81131945


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM