JVM垃圾回收的root根對象有以下幾種:
(1)虛擬機(JVM)棧中引用對象
(2)方法區中的類靜態屬性引用對象
(3)方法區中常量引用的對象(final的常量值)
(4)本地方法棧JNI的引用對象
GC觸發的條件有兩種:
(1)程序調用System.gc()時可以觸發;(不建議)
(2)JVM自身來決定GC
Minor、Major、和 Full GC
年輕代空間(Eden和Survivor區)回收內存稱爲Minor GC。
Minor GC的觸發條件:
對象優先在Eden中分配,當Eden中沒有足夠空間時,虛擬機將發生一次Minor GC。
具體過程:當GC線程啓動時,會通過可達性分析法把Eden區和From Space區的存活對象複製到To Space區,然後把Eden Space和From Space區的對象釋放掉。
Major GC 是清理老年代。
Full GC 是清理整個堆空間—包括年輕代和老年代
發生Minor GC時,虛擬機會檢測之前每次晉升到老年代的平均大小是否大於老年代的剩餘空間大小,如果大於,則進行一次Full GC,如果小於,則查看HandlePromotionFailure設置是否允許擔保失敗,如果允許,那隻會進行一次Minor GC,如果不允許,則改爲進行一次Full GC。
Full GC觸發條件:
(1)調用System.gc時,系統建議執行Full GC,但是不必然執行
(2)老年代空間不足
(3)方法區空間不足
(4)通過Minor GC後進入老年代的平均大小大於老年代的可用內存
(5)由Eden區、From Space區向To Space區複製時,對象大小大於To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小於該對象大小
還有一些關於GC收集器的相關內容,有機會再總結。