JVM學習筆記之三:垃圾回收算法

    在開始以前,須要明確的一點是,這裏談到的垃圾回收算法針對的是JVM的堆內存,棧基本上不存在垃圾回收方面的困擾。 java

    基本垃圾回收算法

    1.引用計數算法(Reference Counting): 程序員

        一種早期的垃圾回收算法。在此方法中,堆中的每個對象都會有一個引用計數值,該對象每增長一個引用的時候,該計數加一,反之則減一。在執行垃圾回收時,那些引用計數值爲0的對象將會被回收。這種方法的一個致命缺陷是沒法處理循環帶來的引用問題,即當兩個對象互相引用時,它們的引用計數值永遠不可能爲0,致使回收算法的失效。所以,這種技術如今已經不爲人所接受。 算法


    2.標記-清除算法(Mark-Sweep): 服務器

        正如名字所描述的,這種算法分兩個階段,第一個是標記階段,收集器從根節點開始遍歷整棵對象引用樹,標記它遇到的每個對象;第二個是清除階段,在第一個階段中未被標記的對象將會被清除。 網絡

        這種算法所面臨的問題是會產生大量的內存碎片。爲了解決這個問題,在這個算法的基礎上又發展出‘中止-複製’,‘標記-整理’這兩個應用較廣的變種算法。 多線程


    3.中止-複製算法(Stop-Copying): 併發

        這種算法將內存分紅兩個大小相等的區域,每次只使用其中的一個區域做爲工做區域。在執行垃圾回收時,回收器遍歷當前使用的區域,將正在被使用的對象複製到未被使用的區域,並進行內存整理,消除碎片,將該區域做爲新的工做區域,而後清空原區域。這種算法的缺陷很明顯,須要兩倍的內存空間,算法執行示意圖以下: oracle


    4.標記-整理算法(Mark-Compact): 學習

        收集器在執行垃圾回收時也是分兩個階段執行,第一個階段回收器會遍歷並標記全部的對象引用樹,第二個階段遍歷整個堆內存,清除全部未被標記的對象並將被標記的對象整理到堆中的某一個區域,從而避免內存碎片的問題。圖: spa

    上面這四種是最基本的垃圾回收算法,在這四種算法思想之上發展出來其他算法,我的認爲更多的是一種內存管理策略,甚至能夠當作就是基本算法的組合應用,就像加減乘除與方程式的關係同樣,所以將其分開描述。


    漸進式算法

    這類算法通常由基本算法組成,其核心思想是將內存分區域進行管理,在不一樣的區域和不一樣的時間採用不一樣的內存管理策略,從而避免因全系統的垃圾回收致使程序長時間暫停。這類算法通常有如下幾種:

    1.火車算法

    這種算法把成熟的內存空間劃爲固定長度的內存塊,算法每次在一個塊中單獨執行,每個塊屬於一個集合。此算法的具體執行步驟較複雜,且沒有具體的應用場景,在此不浪費筆墨,有興趣的同窗能夠本身研究之。

    2.分代收集算法

    這種算法在sun/oracle公司的Hotspot虛擬機中獲得應用,是java程序員須要重點關注的一種算法。

    這種算法是經過對對象的生命週期進行分析後得出的,它將堆內存分紅了三個部分:年青代,年老代,持久代(至關於方法區)。處於不一樣生命週期的對象被存儲於不一樣的區域,並使用不一樣的算法進行回收。這種算法的具體執行細節將會在後續的學習筆記中詳細介紹。


    從網上獲得的資料來看,應該還有一種增量收集算法,可是描述過於模糊,且沒有標明出處,查不到相關資料,marker下,回頭若有發現再回來補之。


    另外須要特別注意的是利用多線程實現的堆垃圾回收技術,這方面資料來源於網絡,摘抄以下:


    1.串行收集

    串行收集使用單線程處理全部垃圾回收工做,由於無需多線程交互,實現容易,並且效率比較高。可是,其侷限性也比較明顯,即沒法使用多處理器的優點,因此此收集適合單處理器機器。固然,此收集器也能夠用在小數據量(100M左右)狀況下的多處理器機器上。

    適用狀況:數據量比較小(100M左右);單處理器下而且對響應時間無要求的應用。

    缺點:只能用於小型應用。


    2.並行收集

    並行收集使用多線程處理垃圾回收工做,於是速度快,效率高。並且理論上CPU數目越多,越能體現出並行收集器的優點。

    適用狀況:「對吞吐量有高要求」,多CPU、對應用響應時間無要求的中、大型應用。舉例:後臺處理、科學計算。

    缺點:應用響應時間可能較長 。


    3.併發收集

    相對於串行收集和並行收集而言,前面兩個在進行垃圾回收工做時,須要暫停整個運行環境,而只有垃圾回收程序在運行,所以,系統在垃圾回收時會有明顯的暫停,並且暫停時間會由於堆越大而越長。

    適用狀況:「對響應時間有高要求」,多CPU、對應用響應時間有較高要求的中、大型應用。舉例:Web服務器/應用服務器、電信交換、集成開發環境。

相關文章
相關標籤/搜索