天天看點

java面試之jvm垃圾回收機制垃圾收集算法分為:分帶的垃圾回收機制:

在我工作第四個年頭的時候, 因為各種原因(薪水低和薪水低。。。)不得不離開自己工作了近三年的公司,走上面試的征程,這一次的面試和三年前的面試改變了不少, 每次面試都會提到jvm的垃圾回收機制!

jvm的記憶體結構 分為 heap堆 stack棧 和方法區method area

這裡講一下jvm的heap堆的垃圾收集算法

jvm将堆記憶體分為 新生代 和老年代(就是所謂的分帶的垃圾回收) ,在heap新生代中又分為eden 和survivor1 和survivor2

垃圾收集算法分為:

1,标記-清除 算法;

2,标記-複制算法;

3,标記-整理算法;

分帶的垃圾回收機制:

新生代:

在對象建立時, Object obj = new Object(); obj 對象的引用将存放早方法區 method area , 真正的對象則存放在 heap堆 eden的中, 當在必要的條件下 jvm 發生gc時, jvm會根據 對象的引用計數器 或者 對象的可達性 進行判斷, 使用标記-複制算法(使用于heap堆的新生代)對 eden中的存活對象進行标記 、年齡+1 然後将标記的存活對象 copy到 heap堆的survivor1 将eden清空, 當survivor1 發生gc 同樣的進行标記複制存活對象 到 survivor2  然後 survivor1 清空, 交替, 新生代的對象很多, 就會将年齡大的存活對象 放到 老年代中

老年代:

當heap堆老年代jvm發生gc, 則會使用 标記整理算法, 堆存活的對象進行标記, 然後将對象進行整理,以免出現存儲碎片, 導緻大對象申請不到記憶體

在新生代中和老年代采用不同的垃圾回收算法, 因為新生代中的對象基本上建立之後 就會死亡, 存活率很低, 是以使用标記複制算法, 将少量的留下來的對象copy到另外一塊地方, 然後清空存儲區域;

而在老年代中 絕大部分的對象都是存活的, 是以使用标記整理的算法 将死掉對象 清除, 然後整理存儲空間, 釋放出連續的heap堆空間位址,更有利于大的, 年齡老的對象申請記憶體

以上是個人的了解, 還望指教!