JVM篇(二)
阿新 • • 發佈:2020-10-17
GC
1.Minor GC 和Full GC什麼時候發生?
Minor GC指在新生代發生的GC,由於java物件大多都是朝生夕死的,所以Minor GC非常頻繁,一般回收速率也快。
Full GC 指老年代發生的GC ,出現Full GC 一般會伴有Minor GC 的出現,Full GC 的速度比Minor GC 慢很多。
1.1觸發Minor GC
虛擬機器在進行Minor GC的時候首先比較老年代連續可用空間是否大於新生代的所有物件的總空間。(可以理解為垃圾桶能不能裝得下)
(1)如果大於,直接進行Minor GC.
(2)如果小於,則判斷是否開啟HandlerPromotionFailure.如果沒有開啟,直接進行Full GC。
1.2觸發Full GC
(1)老年代空間不足
如果建立一個太大的物件,Eden區域放不下這個大物件,會直接儲存在老年代當中,這時候如果老年代空間也不足,就會觸發Full GC。所以為了避免這種情況還是不要建立太大的物件。
(2)持久代空間不足
如果有持久代空間的話,系統當中需要載入的類,呼叫的方法很多,同時持久代當中沒有足夠的空間的話,就會觸發一次Full GC。
(3)Minor GC出現promotion failure
(4)統計Minor GC 發生時晉升到老年代的平均總大小大於老年代的閒置空間
在發生Minor GC是會判斷是否安全,這裡的安全是指,當前老年代空間可以容納Minor GC晉升的物件的平均大小,如果不安全,則直接執行Full GC 。
2.Minor GC執行很頻繁可能是什麼原因引起的?
(1)新生代空間設定太小。
(2)產生太多朝生夕滅的物件導致需要頻繁的進行Minor GC。
3.MinorGC執行的很慢有可能是什麼原因造成的?
(1)新生代空間設定太大。
(2)物件引用鏈較長,進行可達性分析時間較長。
(3)新生代survivor設定比較小,清理後剩餘物件不能裝進去,需要移動到老年代,造成移動開銷。
(4)記憶體分配擔保失敗,由Minor GC 轉為Full GC 。
(5)採用垃圾收集器效率低