JVM垃圾收集算法筆記

      商用HotSpot虛擬機將堆內存分爲年輕代和老年代。年輕代又可細分爲Eden區和From survivor區和To survivor區。Eden和survivor默認使用8:1比例。

       常用收集算法:

        1. 標記--清除算法:分爲“標記”、“清除”兩個階段。先標記所有需要回收的對象,標記完成後統一清除被標記的對象。標記、清除兩個階段的效率都不高,且會產生大量的不連續的內存碎片。所以實際中很少使用,但它是所有其它垃圾收集算法的基礎,其它算法都是在此基礎上進行優化。

        2. 複製算法:將內存分爲兩塊,每次只使用其中一塊,垃圾回收時將所有不需要回收對象複製到另一塊內存,然後將本塊內存全部清除。缺點是浪費一半的內存。研究表明,98%以上的對象是“朝生夕死”,所以HotSport在實現時將內存分爲Eden和兩塊survivor(Eden與Survivor默認比例8:1),每次使用Eden和其中一塊survivor,這樣只浪費了10%的內存。98%的對象可回收只是 一般場景下的數據,我們沒有辦法保證每次回收都只有少於10%的對象存活,當survivor內存不足時需要老年代進行分配擔保。

        3. 標記--整理算法:分爲“標記”、“整理”兩個階段,先標記所有需要回收的對象,標記完成後將所有存活對象向一段移動,然後直接清理掉段邊界以外的內存。

        HotSpot垃圾收集時使用分代收集算法,即年輕代和年老代使用不能的收集算法。年輕代使用複製算法 ,老年代使用標記--整理算法。

 

         如何判斷一個對象需要被回收?

         1. 引用計數法:對象被引用加1,去引用減1,這樣只需要判斷對象的引用計數器是否爲0就可以,但無法解決循環引用問題。

         2. 可達性分析算法:以一系列的“GC ROOTS”的對象爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈(Reference Chain),當一個對象到GC ROOTS沒有任何引用鏈時,則證明這個對象是不可用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章