GC垃圾回收總結

1、如何肯定一個對象是垃圾算法

  1.引用計數法服務器

    public static void main(String[] args){多線程

      Object object1=new Object();併發

      Object object2=new Object();spa

      object1.object=object2; 線程

      object2.object=object1;對象

      object1=null;資源

      object2=null;虛擬機

    }it

  互相引用致使object1和object2都沒法被視爲垃圾

  2.可達性分析

3. 典型的垃圾收集器

垃圾收集算法是垃圾收集器的理論基礎,而垃圾收集器就是其具體實現。下面介紹HotSpot虛擬機提供的幾種垃圾收集器。

3.1. Serial/Serial Old

最古老的收集器,是一個單線程收集器,用它進行垃圾回收時,必須暫停全部用戶線程。Serial是針對新生代的收集器,採用Copying算法;而Serial Old是針對老生代的收集器,採用Mark-Compact算法。優勢是簡單高效,缺點是須要暫停用戶線程。

3.2. ParNew

Seral/Serial Old的多線程版本,使用多個線程進行垃圾收集。

3.3. Parallel Scavenge

新生代的並行收集器,回收期間不須要暫停其餘線程,採用Copying算法。該收集器與前兩個收集器不一樣,主要爲了達到一個可控的吞吐量。

3.4. Parallel Old

Parallel Scavenge的老生代版本,採用Mark-Compact算法和多線程。

3.5. CMS

Current Mark Sweep收集器是一種以最小回收時間停頓爲目標的併發回收器,於是採用Mark-Sweep算法。

CMS(Concurrent Mark-Sweep)是以犧牲吞吐量爲代價來得到最短回收停頓時間的垃圾回收器。對於要求服務器響應速度的應用上,這種垃圾回收器很是適合。在啓動JVM參數加上-XX:+UseConcMarkSweepGC ,這個參數表示對於老年代的回收採用CMS。CMS採用的基礎算法是:標記—清除。

缺點:

1)CMS收集器對CPU資源很是敏感。在併發階段,它雖然不會致使用戶線程停頓,可是會由於佔用了一部分線程而致使應用程序變慢,總吞吐量會下降。

2)CMS收集器沒法處理浮動垃圾,可能會出現「Concurrent Mode Failure(併發模式故障)」失敗而致使Full GC產生。

浮動垃圾:因爲CMS併發清理階段用戶線程還在運行着,伴隨着程序運行天然就會有新的垃圾不斷產生,這部分垃圾出現的標記過程以後,CMS沒法在當次收集中處理掉它們,只好留待下一次GC中再清理。這些垃圾就是「浮動垃圾」。

3)CMS是一款「標記--清除」算法實現的收集器,容易出現大量空間碎片。當空間碎片過多,將會給大對象分配帶來很大的麻煩,每每會出現老年代還有很大空間剩餘,可是沒法找到足夠大的連續空間來分配當前對象,不得不提早觸發一次Full GC。

3.6. G1

G1(Garbage First)收集器技術的前沿成果,是面向服務端的收集器,能充分利用CPU和多核環境。是一款並行與併發收集器,它可以創建可預測的停頓時間模型。

相關文章
相關標籤/搜索