1. 一般年齡判斷
當對象在Eden區中經過第一次 Minor GC 后,如果仍然存活,則會被移動到 From Survivor 區,并且對象的年齡設為 1。每經過一次 Minor GC,存活下來的對象年齡加 1,若存活對象在 From Survivor 區的年齡達到閾值(一般為 15 歲),則會晉升到老年代。
虛擬機并不是永遠地要求對象年齡必須達到了-XX:MaxTenuringThreshold=15才能晉升老年代;
2. 動態年齡判斷
動態年齡判斷: Survivor區的對象年齡從小到大進行累加,當累加到X年齡(某個年齡)時占用空間的總和大于50%(可以使用-XX:TargetSurvivorRatio=?來設置保留多少空閑空間,默認值是50),那么比X年齡大的對象都會晉升到老年代;
3. 大對象
定義大對象的大小的參數是 -XX:PretenureSizeThreshold ,它表示對象在超過這個閾值時將會直接分配到老年代,而不經過新生代。這個參數的默認值可以根據具體的虛擬機版本和配置進行調整,一般情況下默認值是 0,即所有對象都將在新生代分配。
4. 空間擔保機制
執行 Minor GC 之前,會先判斷老年代的可用空間是否大于新生代的全部空間,如果大于會直接執行 Minor GC,小于會判斷老年代的可用空間是否大于 晉升到老年代的平均大小;如果小于,則直接執行 FULL GC 再進行Minor GC;如果大于則嘗試執行一次 Minor GC,在嘗試進行 Minor GC 的過程中,會看看老年代是否放得下,放不下,就先執行一次 FULL GC 然后再執行 Minor GC。
ps:以下是我整理的java面試資料,密碼是obht,感興趣的可以看看。最后,創作不易,覺得寫得不錯的可以點點關注!
鏈接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面試寶典》?