jvm垃圾回收算法

引用計數算法( Reference Counting ) html

    原理很簡單,對象生成後,有一個相關聯的計數器,當有一個地方引用時,計數器加1;當引用失效時,計數器減1。jvm按期掃描對象時,發現計數器爲0的對象就能夠清除。 java

    引用計數算法的優勢和缺陷一樣明顯。這一算法在執行垃圾收集任務時速度較快,但算法對程序中每一次內存分配和指針操做提出了額外的要求(增長或減小內存塊的引用計數)。更重要的是,引用計數算法沒法正確釋放循環引用的內存塊。 算法

可達性分析算法( Reachability Analysis  jvm

    這個算法的基本思路就是經過一系列的稱爲「GC Roots」的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連(用圖論的話來講,就是從GC Roots到這個對象不可達)時,則證實此對象是不可用的。在Java語言中,可做爲GC Roots的對象包括下面幾種: spa

        虛擬機棧(棧幀中的本地變量表)中引用的對象。  
        方法區中類靜態屬性引用的對象。   
        方法區中常量引用的對象。
        本地方法棧中JNI(即通常說的Native方法)引用的對象。 線程

標記-清除算法( Mark-Sweep ) 指針

    正如其名稱所暗示的那樣,標記-清除算法的執行過程分爲「標記」和「清除」兩大階段。這種分步執行的思路奠基了現代垃圾收集算法的思想基礎。與引用計數算法不一樣的是,標記-清除算法不須要運行環境監測每一次內存分配和指針操做,而只要在「標記」階段中跟蹤每個指針變量的指向——用相似思路實現的垃圾收集器也常被後人統稱爲跟蹤收集器( Tracing Collector ) 
    標記的時候,須要stop the world,全部用戶線程暫停,等標記結束後,再將全部沒有標記的內存所有回收掉,但同時會產生不少不連續的內存碎片。 htm

複製算法( Copying ) 對象

    複製算法解決了標記-清除算法的效率問題。它的原理是,將可用內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活着的對象複製到另一塊上面,而後再把已使用過的內存空間一次清理掉。這樣使得每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等複雜狀況,只要移動堆頂指針,按順序分配內存便可,實現簡單,運行高效。只是這種算法的代價是將內存縮小爲了原來的一半,未免過高了一點。    
    如今的商業虛擬機都採用這種收集算法來回收新生代,IBM公司的專門研究代表,新生代中的對象98%是「朝生夕死」的,因此並不須要按照1∶1的比例來劃份內存空間,而是將內存分爲一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊Survivor。當回收時,將Eden和Survivor中還存活着的對象一次性地複製到另一塊Survivor空間上,最後清理掉Eden和剛纔用過的Survivor空間。HotSpot虛擬機默認Eden和Survivor的大小比例是8∶1,也就是每次新生代中可用內存空間爲整個新生代容量的90%(80%+10%),只有10%的內存會被「浪費」。固然,98%的對象可回收只是通常場景下的數據,咱們沒有辦法保證每次回收都只有很少於10%的對象存活,當Survivor空間不夠用時,須要依賴其餘內存(這裏指老年代)進行分配擔保(Handle Promotion)。 進程

    內存的分配擔保就比如咱們去銀行借款,若是咱們信譽很好,在98%的狀況下都能按時償還,因而銀行可能會默認咱們下一次也能按時按量地償還貸款,只須要有一個擔保人能保證若是我不能還款時,能夠從他的帳戶扣錢,那銀行就認爲沒有風險了。內存的分配擔保也同樣,若是另一塊Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象時,這些對象將直接經過分配擔保機制進入老年代。
    複製收集算法在對象存活率較高時就要進行較多的複製操做,效率將會變低。更關鍵的是,若是不想浪費50%的空間,就須要有額外的空間進行分配擔保,以應對被使用的內存中全部對象都100%存活的極端狀況,因此在老年代通常不能直接選用這種算法。

標記-整理算法( Mark-Compact )

    標記-整理算法是標記-清除算法和複製算法的有機結合。標記過程和標記-清除算法的第一步同樣,當標記完畢後,讓全部已標記的對象移動到某一端,而後清理時只須要對端外的內存直接進行回收就能夠了。

增量收集算法( Incremental Collecting )

   增量收集算法的基礎還是傳統的標記-清除和複製算法。增量收集算法經過對進程間衝突的妥善處理,容許垃圾收集進程以分階段的方式完成標記、清理或複製工做。

分代收集算法 ( Generational Collecting )

   分代收集算法一般將堆中的內存塊按壽命分爲兩類,年老的和年輕的。垃圾收集器使用不一樣的收集算法或收集策略,分別處理這兩類內存塊,並特別地把主要工做時間花在處理年輕的內存塊上。分代收集算法使垃圾收集器在有限的資源條件下,能夠更爲有效地工做

參考資料

深刻理解java虛擬機 通俗解釋垃圾回收算法 http://www.game798.com/html/2007-04/3425.htm

相關文章
相關標籤/搜索