老年代(Old generation)
對象沒有變得不可達,並且從新生代中存活下來,會被拷貝到這里。其所占用的空間要比新生代多。也正由於其相對較大的空間,發生在老年代上的GC要比新生代少得多。對象從老年代中消失的過程,我們稱之為**”major GC“ **
minorGC 是清理整合YouGen的過程, eden 的清理,S0\S1的清理都由於MinorGC
Allocation Failure(YoungGen區內存不足,不夠調用) 會觸發minorGC
Minor GC觸發條件:當Eden區滿時,觸發Minor GC。只是會針對新生代的
Major GC 是清理OldGen。
很不幸,實際上它還有點復雜且令人困惑。首先,許多 Major GC 是由 Minor GC 觸發的,所以很多情況下將這兩種 GC 分離是不太可能的。另一方面,許多現代垃圾收集機制會清理部分永久代空間,所以使用“cleaning”一詞只是部分正確。
這使得我們不用去關心到底是叫 Major GC 還是 Full GC,大家應該關注當前的 GC 是否停止了所有應用程序的線程,還是能夠並發的處理而不用停掉應用程序的線程。
Full GC觸發條件:
Full GC定義是相對明確的,就是針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全局范圍的GC;
- 調用System.gc()時,系統建議執行Full GC,但是不必然執行
- 老年代空間不足
- 方法區空間不足
- 通過Minor GC后進入老年代的平均大小大於老年代的可用內存
- 由Eden區、From Space區向To Space區復制時,對象大小大於To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小於該對象大小