JVM垃圾收集算法及垃圾收集器

 今天來總結一下最近學習到的JVM垃圾收集算法和垃圾收集器。原來以爲這部分知識,對於一個Java程序員的用處不大,可是如果你的運營Web項目,出現了性能問題,那麼這部分知識可以幫助你從運維的角度來優化你的項目。

      首先,先講一下JVM的垃圾收集算法,因爲這是學習垃圾收集器的前堤。各種垃圾收集器也都是基於這些算法來實現的。

JVM垃圾收集算法

      JVM垃圾收集算法有四種:標記-清除算法、複製算法、標記-整理算法、分代收集算法

      標記-清除算法:

      該算法如同它的名字一樣,分爲兩個階段:標記、清除。首先標記出所有需要回收的對象,然後,統一清除這些被標記的對象。該算法的缺點是:1、效率不高;2、產生大量不連續的內存碎片,導致有大量內存剩餘的情況下,由於,沒有連續的空間來存放較大的對象,從而觸發了另一次垃圾收集動作。

      複製算法:

      由於標記-清除算法的效率不高,從而提出了複製算法。複製算法將可用的內存分成兩樣大小的兩塊,每次只使用其中一塊內存。當這塊內存用完之後,就把還存活的對象複製到另外一塊上面,然後,把這塊清空。複製算法克服了標記-清除算法的兩個缺點,但是太浪費內存,相當於內存空間減小了一半。

      隨着時間的積累,現在使用的複製算法的虛擬機,不再是把內存分爲1:1的兩塊。因爲98%的對象是壽命很短的,創建之後,很快就被回收了,存活下來的只有2%,所以,用來存儲存活對象的內存區,可以小一些。現在的商業虛擬機是把可用內存分爲一個較大的Eden空間和兩個較小的Survivor空間,每次使用Eden和其中的一塊Survivor。當回收時,把Eden和Survivor中的存活對象一次複製到另一塊Survivor內存區上,然後把Eden和剛纔用過的Survivor空間清空。HotSpot虛擬機默認Eden和Survivor的大小比例是8:1,這樣,每次新產生的對象可以使用90%的內存空間。

      標記-整理算法

      從名字可以看出,該算法是對“標記-清除”算法的改進升級版。同樣的該算法分爲兩個階段:標記、整理。標記階段同“標記-清除”算法。整理階段,不是直接對標記對象進行清理,而是讓所有存活的對象都移動到一端,然後,直接把邊界以外的內存清空。這就解決了“標記-清除”算法會造成大量不連續內存碎片的問題。

      分代收集算法

      分代收集算法是根據對象的存活週期的不同,將內存劃分爲幾塊。當前的商業虛擬機的垃圾收集都採用了該算法。一般把Java堆分成新生代(年輕代)和老年代(年老代)。這樣就可以根據各年代中對象的存活週期來選擇最合適的收集算法了。新生代,由於只有少量的對象能存活下來,所以選用“複製算法”,只需要付出少量存活對象的複製成本。老年代,由於對象的存活率高,沒有額外的空間分擔,就必須使用“標記-清除”或“標記-整理”算法。

 

JVM垃圾收集器

      由於內存中的對象,是按存活週期存放在不同的內存塊中的,所以,我們選擇不同的算法來針對不同的內存塊進行垃圾收集。從而,對於,不同的內存塊,我們需要有不同的垃圾收集器。

      新生代的垃圾收集器有:Serial收集器、ParNew收集器、Parallel Scavenge收集器

      老年代的垃圾收集器有:Serial Old收集器、Parallel Old收集器、CMS收集器、G1收集器

      

      下面我們來分別介紹一下這些垃圾收集器

      Serial收集器/Serial Old收集器

      Serial收集器/Serial Old收集器,是單線程的,使用“複製”算法。當它工作時,必須暫停其它所有工作線程。特點:簡單而高效。對於運行在Client模式下的虛擬機來說是一個很好的選擇。

      ParNew收集器

      ParNew收集器,是Serial收集器的多線程版。是運行在Server模式下的虛擬機中首選的新生代收集器。除了Serial收集器外,目前只有它能與CMS收集器配合工作。

      Parallel Scavenge收集器/Parallel Old收集器

      Parallel Scavenge收集器,也是使用“複製”算法的、並行的多線程收集器。這些都和ParNew收集器一樣。但它關注的是吞吐量(CPU用於運行用戶代碼的時間與CPU總消耗時間的比值),而其它收集器(Serial/Serial Old、ParNew、CMS)關注的是垃圾收集時用戶線程的停頓時間。

      Parallel Old收集器是Parallel Scavenge收集器的老年代版本。

      CMS收集器

      CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間爲目標的收集器,使用“標記-清除”算法。

      CMS收集器分4個步驟進行垃圾收集工作:

      1、初始標記   2、併發標記   3、重新標記   4、併發清除

      其中“初始標記”、“重新標記”是需要暫停其它所有工作線程的。

      G1收集器

      G1(Garbage First)收集器,基於“標記-整理”算法,可以非常精確地控制停頓。



轉自ITEYE網站,buddie 博客,原文:http://buddie.iteye.com/blog/1824937

發佈了43 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章