jvm 調優(2)垃圾回收算法

能夠從不一樣的的角度去劃分垃圾回收算法:java

按照基本回收策略分

引用計數(Reference Counting):算法

比較古老的回收算法。原理是此對象有一個引用,即增長一個計數,刪除一個引用則減小一個計數。垃圾回收時,只用收集計數爲0的對象。此算法最致命的是沒法處理循環引用的問題。服務器

 

標記-清除(Mark-Sweep):多線程

 

 

此算法執行分兩階段。第一階段從引用根節點開始標記全部被引用的對象,第二階段遍歷整個堆,把未標記的對象清除。此算法須要暫停整個應用,同時,會產生內存碎片。併發

複製(Copying):線程

 

 

此算法把內存空間劃爲兩個相等的區域,每次只使用其中一個區域。垃圾回收時,遍歷當前使用區域,把正在使用中的對象複製到另一個區域中。次算法每次只處理正在使用中的對象,所以複製成本比較小,同時複製過去之後還能進行相應的內存整理,不會出現「碎片」問題。固然,此算法的缺點也是很明顯的,就是須要兩倍內存空間。對象

標記-整理(Mark-Compact):生命週期

 

 

此算法結合了「標記-清除」和「複製」兩個算法的優勢。也是分兩階段,第一階段從根節點開始標記全部被引用對象,第二階段遍歷整個堆,把清除未標記對象而且把存活對象「壓縮」到堆的其中一塊,按順序排放。此算法避免了「標記-清除」的碎片問題,同時也避免了「複製」算法的空間問題。內存

按分區對待的方式分

增量收集(Incremental Collecting):實時垃圾回收算法,即:在應用進行的同時進行垃圾回收。不知道什麼緣由JDK5.0中的收集器沒有使用這種算法的。開發

 

分代收集(Generational Collecting):基於對對象生命週期分析後得出的垃圾回收算法。把對象分爲年青代、年老代、持久代,對不一樣生命週期的對象使用不一樣的算法(上述方式中的一個)進行回收。如今的垃圾回收器(從J2SE1.2開始)都是使用此算法的。

 

按系統線程分

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

 

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

 

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

 

如何分代


虛擬機中共劃分出三個代,分別是 年輕代,老年代,持久代。其中持久代中主要存儲的是java類的類信息和常量池。與垃圾收集要收集的java對象關係不大。年輕代和老年代的劃分是對垃圾收集影響比較大的。

年輕代 :

    全部新生成的對象所有放在新生代,新生代的目標就是儘量快速的收集掉這些生命週期短的對象。年輕代分爲三個區。一個Eden區,和兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(其中一個),當這個Survivor和Eden也滿的時候,存活的對象將被複制到另外一個Survivor區。通過屢次複製還存活的對象將被複制到老年代。

老年代:

    在年輕代經歷了n次垃圾回收仍然存活的對象將被複制到老年代。所以能夠認爲,老年代存放的對象都是生命週期較長的對象。

持久代

    用於存放靜態問題,如java類和方法,常量池。持久代對垃圾回收沒有顯著影響。

什麼狀況下會觸發垃圾回收

    由於對象進行了分代處理,所以垃圾回收的區域,時間不同。GC分爲兩張,一種是Scavenge GC 和 Full GC

Scavenge GC

    通常狀況下,當新對象生成,而且在Eden申請空間失敗時,就會觸發Scavenge GC,對Eden區域進行GC,清除非存活對象,而且把尚且存活的對象移動到Survivor區。而後整理Survivor的兩個區。這種方式的GC是對年輕代的Eden區進行,不會影響到年老代。由於大部分對象都是從Eden區開始的,同時Eden區不會分配的很大,因此Eden區的GC會頻繁進行。於是,通常在這裏須要使用速度快、效率高的算法,使Eden去能儘快空閒出來。

Full GC

    對整個堆進行整理,包括新生代,老年代和持久代。Full GC要對整個堆進行整理,所以要比Scvaenge GC慢,所以應該儘量的減小Full GC 的次數。在對JVM調優的工做中,很大一部分就是對Full GC的調節。

不一樣的垃圾回收器

串行處理器

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

  缺點:只能用於小型應用

並行處理器

  試用狀況:對吞吐量有高要求,多CPU、對響應時間無要求的大中型應用

  缺點:垃圾收集過程當中應用響應時間可能加長

併發處理器

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

相關文章
相關標籤/搜索