JVM調優之:垃圾收集器

java語言最大的特色就是能夠進行自動垃圾回收處理,無需開發人員過於關注系統資源的釋放狀況。自動垃圾收集雖然大大減輕了開發人員的工做量,但同時也增長了軟件系統的負擔。一個不合適的垃圾回收方法和策略會對系統形成不良影響。java

1.垃圾與回收算法思想

引用計數法:

引用計數法是最經典也是最古老的的一種垃圾回收方法,引用計數器的實現很簡單,對於一個對象A,只要任何一個對象引用了A,則A的計數器上就加1,當引用失效就減1,當A的引用計數器值爲0時,則A就不會再被引用。算法

引用計數器的實現也很簡單,可是有一個嚴重的問題,即沒法處理相互引用的狀況。就好比A對象引用了B對象,同時B對象也引用的A對象,除此以外在沒有其餘對象應用A和B,則A和B引用計數器的值都不爲0,可是A和B均不會再被使用,這樣就致使不能回收到A和B對象,引發內存泄露。多線程

標記-清除算法:

標記清除算法是現代垃圾回收算法的思想基礎。標記清除算法把垃圾回收分爲兩個階段:標記階段和清除階段。一種可行的實現是,在標記階段,首先經過根節點,標記全部從根節點可達的對象。所以未標記的對象就是未被引用的垃圾對象。而後在清除階段,清除全部未被標記的對象。標記-清除算法最大的一個問題就是空間碎片。覺得回收後的空間是不連續的,工做效率低於連續的內存空間。併發

複製算法:

複製算法是一種相對高效的回收方法。它的核心思想是:將原有的內存空間分紅兩塊,每次只使用其中的一塊,在垃圾回收時,將正在使用的內存中的存活對象複製到未使用的內存塊中,清除正在使用的內存塊中的全部對象,交換兩個內存塊角色,完成垃圾回收。在JVM新生代中survivor中使用了複製算法進行垃圾回收。若是系統中的垃圾對象不少,複製算法須要複製的存活對象數量並不會太大,所以在垃圾回收時,複製算法的效率是很高的。且複製是統一將存活對象複製到新的內存區域中,所以不會產生空間碎片。性能

標記-壓縮算法:

複製算法的高效性是創建在垃圾對象多,存活對象少的前提下。這種狀況年輕代常常發生,可是對於老年代每每是存活對象多,垃圾對象少,在這種狀況下複製的成本也將很高,所以複製算法並不適合老年代垃圾回收。優化

標記-壓縮算法是一種老年代的垃圾回收算法,它在標記-清除算法的基礎上作了一些優化。標記-壓縮算法首先也是須要從跟節點開始,對全部可達對象作一次標記,而後將全部存活對象壓縮到內存的一端,而後清除掉邊界外的全部空間。這種算法避免了碎片的產生,也不須要兩個相同的內存空間,所以性價比較高。spa

增量算法:

對大部分垃圾回收算法而言,在垃圾回收的過程當中,應用系統軟件處於一種「Stop the World」的狀態。在「Stop the World」狀態下應用程序的全部線程都會掛起,暫停一切正常的工做,等待垃圾回收的完成。若是垃圾回收時間很長,應用系統暫停時間也會很長,影響用戶體驗。線程

增量算法的基本思想是若是一次性將全部垃圾進行處理,須要形成系統長時間的停頓,那麼可讓垃圾收集和應用程序交替止執行。每次,垃圾收集之回收一小片內存區域,接着切換到應用程序執行。如此反覆直到垃圾回收完成。這種間斷式的垃圾收集雖然減少了應用系統的等待時間,可是因爲線程的切換和上下文替換的消耗,會使得垃圾回收的總體成本升高。對象

分代:

前面介紹的複製、標記-清除、標記-壓縮等算法,並無一種算法能夠徹底替換其餘算法。它們都有各自的優缺點。所以根據垃圾回收對象的特色不一樣,使用不一樣的回收算法纔是明智之舉。內存

分代就是基於這種思想,它將內存區域根據對象的特色分紅不一樣的內存區域,根據每塊區域對象的特徵不一樣使用不一樣的回收算法,以提升工做效率。

2.垃圾收集器的類型

按線程數分:

串行:一次只使用一個線程繼續垃圾回收。

並行:一次開啓多個線程進行垃圾回收。在cup能力較強時使用並行能夠提升垃圾收集效率,縮短GC停頓時間。

按工做模式分:

併發式:併發式垃圾收集器與應用系統交替工做,以儘量減小應用系統的停頓時間。

獨佔式:獨佔式垃圾收集器一旦運行「Stop the World」就中止應用程序運行,直到垃圾收集徹底接受,才容許應用程序執行。

按工做內存區間分:

新生代垃圾收集器:只在新生代工做。

老年代垃圾收集器:只在老年代工做。

3.垃圾收集器

新生代串行收集器:單線程、獨佔式、複製算法;單CPU處理器時性能優越。

老年代串行收集器:單線程、獨佔式、標記-壓縮算法;

並行收集器:工做在新生代、將新生代串行收集器多線程化,回收策略、算法、參數和新生產串行收集器同樣。

新生代並行收集器:和並行收集器同樣,可是能夠設置「最大垃圾收集停頓時間」和「吞吐量大小」。自適應GC條件策略。

老年代並行收集器:標記-壓縮算法,能夠設置「最大垃圾收集停頓時間」和「吞吐量大小」。

CMS收集器:併發、標記、清除

G1收集器:標記壓縮算法,能夠進行精確停頓控制(在M時間內,停頓時間不超過N),預期優於CMS收集器。

相關文章
相關標籤/搜索