經常使用垃圾回收算法

經常使用垃圾回收算法web

   今天我關於常見的垃圾回收算法來作個總結,咱們最常聽到的是Java虛擬機裏的垃圾回收機制,其實垃圾回收的概念最早並非Java裏首先提出來的,

垃圾回收這個概念很早就已經被提出來了,而且已經在其餘語言中獲得了應用。算法

      關於垃圾回收的機制,這裏再也不解釋,這篇文章我主要介紹常見的垃圾回收算法,固然還有其餘的。spa

算法一:引用計數法。對象

            這個方法是最經典點的一種方法。具體是對於對象設置一個引用計數器,每增長一個變量對它的引用,引用計數器就會加1,沒減小一個變量的引用,blog

            引用計數器就會減1,只有當對象的引用計數器變成0時,該對象纔會被回收。可見這個算法很簡單,可是簡單每每會存在不少問題,這裏我列舉最明顯的兩個問題,生命週期

            一是採用這種方法後,每次在增長變量引用和減小引用時都要進行加法或減法操做,若是頻繁操做對象的話,在必定程度上增長的系統的消耗。內存

            二是這種方法沒法處理循環引用的狀況。再解釋下什麼是循環引用,假設有兩個對象 A和B,A中引用了B對象,而且B中也引用了A對象,虛擬機

                     那麼這時兩個對象的引用計數器都不爲0,可是因爲存在相互引用致使沒法垃圾回收A和 B,致使內存泄漏。class

算法二:標記清除法。效率

            這個方法是將垃圾回收分紅了兩個階段:標記階段和清除階段。

            在標記階段,經過跟對象,標記全部從跟節點開始的可達的對象,那麼未標記的對象就是未被引用的垃圾對象。

            在清除階段,清除掉全部的未被標記的對象。

            這個方法的缺點是,垃圾回收後可能存在大量的磁盤碎片,準確的說是內存碎片。由於對象所佔用的地址空間是固定的。對於這個算法還有改進的算法,就是我後面要說的算法三。

算法三:標記壓縮清除法(Java中老年代採用)。

            在算法二的基礎上作了一個改進,能夠說這個算法分爲三個階段:標記階段,壓縮階段,清除階段。標記階段和清除階段不變,只不過增長了一個壓縮階段,就是在作完標記階段後,

            將這些標記過的對象集中放到一塊兒,肯定開始和結束地址,好比所有放到開始處,這樣再去清除,將不會產生磁盤碎片。可是咱們也要注意到幾個問題,壓縮階段佔用了系統的消耗,

            而且若是標記對象過多的話,損耗可能會很大,在標記對象相對較少的時候,效率較高。

算法四:複製算法(Java中新生代採用)。

           核心思想是將內存空間分紅兩塊,同一時刻只使用其中的一塊,在垃圾回收時將正在使用的內存中的存活的對象複製到未使用的內存中,而後清除正在使用的內存塊中全部的對象,

           而後把未使用的內存塊變成正在使用的內存塊,把原來使用的內存塊變成未使用的內存塊。很明顯若是存活對象較多的話,算法效率會比較差,而且這樣會使內存的空間折半,可是這種方法也不會產生內存碎片。

算法五:分代法(Java堆採用)。

          主要思想是根據對象的生命週期長短特色將其進行分塊,根據每塊內存區間的特色,使用不一樣的回收算法,從而提升垃圾回收的效率。

          好比Java虛擬機中的堆就採用了這種方法分紅了新生代和老年代。而後對於不一樣的代採用不一樣的垃圾回收算法。

          新生代使用了複製算法,老年代使用了標記壓縮清除算法。

算法六:分區算法。

           這種方法將整個空間劃分紅連續的不一樣的小區間,每一個區間都獨立使用,獨立回收,好處是能夠控制一次回收多少個小區間。

 

 總結:各類回收算法都有各自的優缺點,沒有一種算法能夠徹底替代其餘的算法,在具體的使用中應該結合具體的環境來選擇。

相關文章
相關標籤/搜索