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

    今天來總結一下最近學習到的JVM垃圾收集算法和垃圾收集器。原來覺得這部分知識,對於一個Java程序員的用處不大,但是若是你的運營Web項目,出現了性能問題,那麼這部分知識能夠幫助你從運維的角度來優化你的項目。
    首先,先講一下JVM的垃圾收集算法,由於這是學習垃圾收集器的前堤。各類垃圾收集器也都是基於這些算法來實現的。
    
    1、JVM垃圾收集算法
      JVM垃圾收集算法有四種:標記-清除算法、複製算法、標記-整理算法、分代收集算法
      
      標記-清除算法:
      該算法如同它的名字同樣,分爲兩個階段:標記、清除。首先標記出全部須要回收的對象,而後,統一清除這些被標記的對象。該算法的缺點是:一、效率不 高;二、產生大量不連續的內存碎片,致使有大量內存剩餘的狀況下,因爲,沒有連續的空間來存放較大的對象,從而觸發了另外一次垃圾收集動做。
      
      複製算法:
      因爲標記-清除算法的效率不高,從而提出了複製算法。複製算法將可用的內存分紅兩樣大小的兩塊,每次只使用其中一塊內存。當這塊內存用完以後,就把還存活 的對象複製到另一塊上面,而後,把這塊清空。複製算法克服了標記-清除算法的兩個缺點,可是太浪費內存,至關於內存空間減少了一半。
      隨着時間的積累,如今使用的複製算法的虛擬機,再也不是把內存分爲1:1的兩塊。由於98%的對象是壽命很短的,建立以後,很快就被回收了,存活下來的只有 2%,因此,用來存儲存活對象的內存區,能夠小一些。如今的商業虛擬機是把可用內存分爲一個較大的Eden空間和兩個較小的Survivor空間,每次使 用Eden和其中的一塊Survivor。當回收時,把Eden和Survivor中的存活對象一次複製到另外一塊Survivor內存區上,而後把 Eden和剛纔用過的Survivor空間清空。HotSpot虛擬機默認Eden和Survivor的大小比例是8:1,這樣,每次新產生的對象可使 用90%的內存空間。
      
      標記-整理算法
      從名字能夠看出,該算法是對「標記-清除」算法的改進升級版。一樣的該算法分爲兩個階段:標記、整理。標記階段同「標記-清除」算法。整理階段,不是直接 對標記對象進行清理,而是讓全部存活的對象都移動到一端,而後,直接把邊界之外的內存清空。這就解決了「標記-清除」算法會形成大量不連續內存碎片的問 題。
      
      分代收集算法
      分代收集算法是根據對象的存活週期的不一樣,將內存劃分爲幾塊。當前的商業虛擬機的垃圾收集都採用了該算法。通常把Java堆分紅新生代(年輕代)和老年代 (年老代)。這樣就能夠根據各年代中對象的存活週期來選擇最合適的收集算法了。新生代,因爲只有少許的對象能存活下來,因此選用「複製算法」,只須要付出 少許存活對象的複製成本。老年代,因爲對象的存活率高,沒有額外的空間分擔,就必須使用「標記-清除」或「標記-整理」算法。
 
    2、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個步驟進行垃圾收集工做:
      一、初始標記   二、併發標記   三、從新標記   四、併發清除
      其中「初始標記」、「從新標記」是須要暫停其它全部工做線程的。
      
      G1收集器
      G1(Garbage First)收集器,基於「標記-整理」算法,能夠很是精確地控制停頓。併發


    3、總結運維

    wKioL1g-qLDxa4XJAAODVXA321Y780.png-wh_50

相關文章
相關標籤/搜索