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.可達性分析
垃圾收集算法是垃圾收集器的理論基礎,而垃圾收集器就是其具體實現。下面介紹HotSpot虛擬機提供的幾種垃圾收集器。
最古老的收集器,是一個單線程收集器,用它進行垃圾回收時,必須暫停全部用戶線程。Serial是針對新生代的收集器,採用Copying算法;而Serial Old是針對老生代的收集器,採用Mark-Compact算法。優勢是簡單高效,缺點是須要暫停用戶線程。
Seral/Serial Old的多線程版本,使用多個線程進行垃圾收集。
新生代的並行收集器,回收期間不須要暫停其餘線程,採用Copying算法。該收集器與前兩個收集器不一樣,主要爲了達到一個可控的吞吐量。
Parallel Scavenge的老生代版本,採用Mark-Compact算法和多線程。
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。
G1(Garbage First)收集器技術的前沿成果,是面向服務端的收集器,能充分利用CPU和多核環境。是一款並行與併發收集器,它可以創建可預測的停頓時間模型。