JAVA垃圾回收Garbage Collection(2、垃圾收集器)
垃圾收集器 java
HotSpot虛擬機的垃圾收集器
Java虛擬機規範中對垃圾收集器如何實現沒有任何規定,所以不一樣版本的虛擬機所提供的垃圾收集器均可能有很大的差異,而且都會提供參數供用戶本身應用的特色和要求組合出各個年代使用的收集器。java 1.7以後的Hotspot虛擬機包含的收集器以下:
新生代收集器:Serial ,ParNew,Parallel Scavenge
老年代收集器:CMS,Serial Old,Parallel Old
獨立堆收集器:G1
Serial收集器
serial收集器是最基本發展歷史最悠久的收集器。在jdk1.3以前是虛擬機新生代收集的惟一選擇。這個收集器是單線程收集器,但它單線程的意義並不只僅說明它只會使用一個CPU或者一條收集線程去完成垃圾收集工做,更重要的是,它進行垃圾收集時,必須暫停其餘全部的線程,之道它收集結束。"Stop The World"是這個收集器的特色。這個工做實際上是由虛擬機在後臺自動發起自動完成的在用戶不可見的狀況下把用戶正常工做的線程所有停掉對不少應用難以接受。可是虛擬機開發團隊爲消除或者工做線程由於內存回收而致使的停頓一直努力進行着,從serial到Parallel收集器到CMS再到G1,一個個愈來愈優秀的收集器出現,用戶線程停頓時間不斷縮短,可是仍然沒辦法消除。
serial優勢:簡單高效,對單CPU的環境Serial收集器因爲沒有線程交互的開銷,專心作垃圾收集天然能夠得到最高的單線程收集效率,在應用場景中分配給虛擬機內存的通常不會很大,收集幾十上百兆的新生代時,停頓時間能夠控制到幾十毫秒最多一百毫秒內只要不是頻繁發生這點停頓是能夠接受的。因此serial在Client模式下的虛擬機是個很好的選擇。
ParNew收集器
ParNew收集器實際上是Serial收集器的多線程版本,除了使用多線程進行垃圾回收外,其他包括Serial收集器的全部可控參數,收集算法,Stop The World 對象分配規則,回收策略都和Serial同樣。示意圖以下:
目前只有ParNew收集器能和CMS收集器配合工做,成爲Server模式下虛擬機的首選新生代收集器。
Parallel Scavenge收集器
新生代收集器,使用的也是複製算法Parallel Scavenge收集器的特色是它的關注點和其餘收集器不一樣CMS等收集器的關注點是儘量的縮短垃圾收集時用戶線程的停頓時間,而Parallel Scavenge收集器的目標則是達到一個可控的吞吐量(ThroughPut)。吞吐量:就是cpu用於運行用戶代碼的時間與cpu總消耗時間的比值,吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間),虛擬機運行了100分鐘,垃圾收集花掉1分鐘,吞吐量就是99%。
Parallel Scavenge 收集器總共有兩個參數用以精確控制吞吐量分別是:最大垃圾收集停頓時間-XX:MaxGCPauseMills,直接設置吞吐量大小的-XX:GCTimeRatio
MaxGCPauseMills:GC停頓時間縮短是犧牲吞吐量和新生代空間換來的,系統把新生代調小點,收集200M確定比500M快,這也致使垃圾收集器更加頻繁的原來10s一次,每次100ms,如今是5s一次每次70ms。停頓時間下來了,吞吐 量也下來了。
GCTimeRatio:0-100的整數,垃圾收集時間佔總時間的佔比,就是吞吐量的倒數;如默認是99 就是佔用1%(1/(99+1))的垃圾收集時間;
-XX:+UseAdaptiveSizePolicy:打開後不須要手動設定Eden Survivor比例,老年代對象大小的細節參數,續集及會動態調整這些參數以提供最適合的停頓時間或者最大的吞吐量。自適應調節也是與ParNew收集器的重要區別。
Serial Old
serial的老年代版本,單線程收集器使用標記-整理算法,主要在Client模式下的虛擬機下使用
JDK1.5以前與Parallel Scavenge收集器搭配使用,CMS的後備預案
Parallel Old
Parallel Scavenge收集器的老年代版本,使用多線程和標記整理算法。
新生代若是選擇了Parallel Scavenge收集器,老年代只能使用Serial Old,有了Parallel Old出現後,在注重吞吐量和CPU敏感的資源場合能夠優先使用Parallel Scavenge和Parallel Old組合。
CMS(Concurrent Mark Sweep)
G1(Garbage First)
G1收集器是一款面向服務端應用的垃圾收集器
並行與併發:G1能充分利用多CPU多核環境下的硬件優點,使用多個CPU來縮短Stop-The-World的時間
分代收集:G1收集器可收集新生代老年代兩種,不須要其餘收集器配合就能夠獨立管理整個GC堆
空間整合:G1採用"標記-整理"算法實現收集器,意味着G1運做期間不會產生內存空間碎片,收集後可提供規整的可用內存
可預測的停頓:創建可預測的停頓時間模型,能讓使用者明確指定一個長度爲M毫秒的時間片斷內,消耗在垃圾收集器上的時間不得超過N毫秒
歡迎關注本站公眾號,獲取更多信息