JVM各垃圾收集器對比

本隨筆是《深刻理解Java虛擬機 JVM高級特性與最佳實踐》讀書筆記。算法

1.JDK1.7以後的HotSpot虛擬機所包含的全部收集器以下:併發

 

解讀:佈局

1. 總共有7種垃圾收集器學習

2.Serial,ParNew,Parallel Scavenge 負責堆年輕代中的內存回收網站

3.Serial Old,CMS,Parallel Old 負責堆老年代中的內存回收spa

4.G1分代回收,能獨立管理整個GC堆線程

5.兩個收集器中間存在連線的,說明可以配合工做server

 

各個收集器對比對象

名稱blog

收集算法

工做區域

可配合對象

線程

併發

適用場合

優缺點

Serial

複製算法

新生代

CMS;

Serial Old

CPU;

Client模式下

缺:stop the world;

優:簡單高效,沒有線程交互開銷,專一於GC;

ParNew

複製算法

新生代

CMS;

Serial Old

CPU;

Server模式下

缺:stop the world

優:並行併發GC

Parallel Scavenge

複製算法

新生代

Serial Old;

Parallel

Scavenge

吞吐量控制,Client,server都可以

主要關注吞吐量,經過吞吐量的設置控制停頓時間,適應不一樣的場景

Serial Old

標記整理算法

老年代

Serial,ParNew,Parallel  Scavenge

主要Client模式下

缺:stop the world

Parallel Old

複製算法(Parallel Scavenge老年代版本)

老年代

Parallel Scavenge

吞吐量控制,Client,server都可以

主要關注吞吐量,經過吞吐量的設置控制停頓時間,適應不一樣的場景

CMS(Concurretn Mark Sweep)

標記清除算法

老年代

Serial,ParNew,

Serial Old是其備選方案

互聯網站;B/S系統服務端

缺:CPU資源敏感,沒法處理浮動垃圾,產生大量內存碎片

優:併發收集,低停頓

G1

總體基於標記整理算法

新生代&老年代

 

面向服務端應用

優:並行與併發,

分代收集,空間整合(標記整理算法),可預測停頓

 

名詞解釋

並行(Parallel):只多條垃圾收集線程並行工做,但此時用戶線程處於等待狀態,也就是stop the world.

併發(Concurrent):只用戶線程與垃圾收集線程同時執行(但不必定是並行的,可能會交替執行),用戶程序在繼續運行,而垃圾收集程序運行於另外一個CPU.

 

Garbage First收集器

現最流行的是G1(Garbage First)收集器,也是當今收集器技術發展的最前沿成果之一,現重點學習一下。

1.優勢

  • 並行與併發;
  • 分代收集;雖然G1能夠不須要其餘收集器配合而獨立管理整個GC堆,可是它可以採用不一樣的收集算法去處理新建立的對象和已經存活一段時間,熬過屢次GC的對象。
  • 空間整合;G1總體是基於標記-整理算法。因此運行期間不會產生內存碎片,收集後能提供規整的可用內存。在分配打對象時不會由於沒法找到連續內存而觸發下一次GC。
  • 可預測的停頓;G1除了追求低停頓之外,還能創建可預測的停頓時間模型,能讓使用者明確指定在一個長度爲M毫秒的時間片斷內,消耗在垃圾收集上的時間不超過N毫秒。

 

2.特色

  • 對堆的劃分;G1以前的收集器對內存的收集都是新生代或者老年代,而G1不在這樣。使用G1收集器時,Java堆的內存佈局就和其餘收集器有很大區別,他將整個堆劃分紅多個大小想等的區域(Region).雖然還有概念上的新生代和年老代,但他們之間已經不在物理隔離了,他們都是一部分Region(不須要連續的)的集合。
  • 回收等級;G1能實現可預測的停頓是由於它能夠避免對堆中進行全區域的垃圾收集。G1跟蹤各個Region裏面的垃圾的價值(回收的內存大小和時間的比值)大小,在後臺維護一個優先列表,每次優先回收價值最大的Region,這也是可預測停頓的實現的原理。

 

3.須要思考的問題

 G1把內存化整爲零,將整個堆劃分爲多個Region。那麼垃圾收集真的就是以Region爲單位進行的嗎?聽起來瓜熟蒂落,仔細想一想其實不是,Region不多是孤立的。一個對象分配在某個Region中,但它並非只能被本Region中的其餘對象引用,而是能夠爲整個堆中的任意其餘對象引用。那麼在利用可達性分析判斷對象是否存活時,豈不是要掃描整個Java堆才能保證準確性?此類問題在其餘收集器中也會出現,新生代年老代一樣面臨此類問題。

  此類問題的JVM採用Remembered Set來避免全堆掃描。(包括新生代年老代的解決思路)。Remembered  Set工做機制,詳見 《深刻理解Java虛擬機 JVM高級特性與最佳實踐》第三章3.5.7

 

4.運做步驟

  • 初始標記;
  • 併發標記
  • 最終標記
  • 篩選回收
相關文章
相關標籤/搜索