垃圾收集器的種類及原理
1、Serial收集器:古老的單執行緒收集器,作用於新生代。單執行緒的意義並非僅僅是隻使用一條執行緒進行垃圾回收,更重要的是,在進行垃圾回收的時候,必須暫停其他所有的工作執行緒,因此,使用者體驗很不好。單實際上,Serial並不是一個一無是處的垃圾收集器,當虛擬機器執行在Client模式下,Serial仍然是Client模式下的預設垃圾收集器。它有著優於其他收集器的地方:簡單而高效。對於限定單個CPU的環境來說,Serial收集器由於沒有執行緒互動的開銷,專心做垃圾收集自然可以獲得最高的,單執行緒收集效率,收集幾十M甚至一兩百M的垃圾(僅僅是新生代使用的記憶體,桌面應用不會再大了),停頓時間可以控制在幾十毫秒最多一百毫秒,因此是一個很好的選擇。
2、ParNew收集器:其實就是Serial收集器的多執行緒版本,但是同樣需要stop the world。ParNew收集器是工作在Server模式下的虛擬機器中首選的新生代收集器。除了效能以外,更重要的原因是ParNew是目前唯一能與CMS收集器配合工作的收集器。ParNew收集器與Serial收集器在可用的所有控制引數、收集演算法、Stop the world、物件分配規則、回收策略等都與Serial收集器完全一樣,也公用了相當多的程式碼。ParNew收集器在單cpu的環境中絕對不會有比Serial收集器更好的效果,它預設開啟的收集執行緒數與cpu的數量相同,在cpu非常多的環境中,可以使用-XX:ParallelGCThreads來限制垃圾收集器的執行緒數
3、CMS收集器:一款老年代收集器。這是第一款真正意義上的併發收集器,這款收集器在強互動的應用中幾乎具有劃時代的意義,它第一次實現了讓垃圾收集執行緒與使用者工作執行緒同時工作,簡單的說,就是你媽媽在打掃房間的時候,你可以往地上扔紙了。不幸的是,作為老年代收集器,確無法與jdk1.4.0中的已經存在的新生代收集器:Parallel Scavenge配合工作。所以在jdk1.5中,CMS收集器只能與Serial或者ParNew收集器聯合工作。
4、Parallel Scavenge收集器:也是一個新生代收集器,它也是使用複製演算法的,並行的多執行緒的收集器,看上去和ParNew一樣,它的特別之處在於,使用Parallel Scavenge收集器的目的在於達到一個可控制的吞吐量。吞吐量是指CPU用於執行使用者執行緒的時間與CPU的總執行時間的比值,虛擬機器運行了100分鐘,垃圾回收用了1分鐘,則吞吐量就是99%。停頓時間越短就越適合與使用者互動的程式,良好的響應速度能提高使用者的體驗。而高吞吐量可以高效率的利用cpu時間,儘快完成程式的運算任務。主要適合在後臺進行計算而不需要太多互動的任務。
Parallel Scavenge收集器提供了兩個引數用於精確的控制吞吐量:
-XX:MaxGCPauseMillis:最大垃圾收集停頓時間
-XX:GCTimeRatio:直接控制吞吐量
但是GC停頓時間的縮短,是用犧牲吞吐量和新生代空間來換取的。
除了上述兩個引數外,Parallel Scavege收集器還提供了一個引數:
-XX:UseAdaptiveSizePolicy:這是一個開關引數,當這個引數開啟之後,就不需要手工指定新生代的大小,(-Xmn)、Eden與Survivor區的比列
(-XX:SurvivorRatio)、晉升老年代物件的年齡(-XX:PretenureSizeThreshold)等細節引數了,虛擬機器會根據監測結果自動分配,這種方式稱之為GC自適應調節策略。
5、Serial Old優化器:是Serial的老年代版本,也是一個單執行緒收集器,使用標記整理演算法。這個收集器的主要作用也是用於在Client模式下使用,如果是Server模式下,它主要還有兩大用途,一是可以與Parallel Scavege收集器搭配使用,而是作為CMS收集器的後備預案,在併發收集發生Concurrent Mode Failure時使用,這兩點將在後面的章節中詳細講解。
6、Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多執行緒和標記整理演算法。這個收集器是JDK1.6版本以後才開始提供的,在此之前,新生代的收集器Parallel Scavenge一直處於一個比較尷尬的境地。原因是,新生代選擇了Parallel Scavenge收集器,老年代除了Serial Old收集器外別無選擇(Parallel Scavenge收集器無法與CMD收集器配合使用)。由於老年代Serial Old收集器在服務端上效能的拖累,使用了Parallel Scavenge未必能獲得整體效果上的吞吐量最大化。
7、CMS(Concorrect mask sweep)收集器:一種以獲取最短停頓時間為目標的收集器。從名字上可以看出,這種收集器是基於標記清掃演算法實現的,它的運作過程相當於前面幾種收集器更復雜一點,整個過程分為四個步驟:
初始標記
併發標記
重新標記
併發清除
其中,初始標記,併發標記這兩個過程仍然需要stop the world,初始標記僅僅只是標記一下GC ROOT 能直接關聯到的物件,速度很快,併發標記就是進行GC Roots Tracing的過程,而重新標記階段則是為了修改併發標記期間因使用者程式繼續運作而導致標記產生變動的那一部分物件的標記記錄,這個階段的停頓時間一般會比初始標記時間稍微長一點,單遠比並發標記的時間短。
由於整個過程中耗時最長的併發標記和併發清楚過程,收集器執行緒都可以與使用者執行緒一起工作,所以,從總體上來說,CMS收集器的記憶體回收過程是與使用者執行緒一起併發執行的。
相關推薦
JVM垃圾回收演算法、垃圾收集器種類、常用垃圾收集器引數
現在的商業虛擬機器都採用這種方法進行回收新生代,但並不是將新生代分為兩個一樣大小的記憶體,由於考慮到98%的物件都是很快死亡的,所以將新生代分為 一個大的eden區和兩個小的survivor區,每次只使用eden區和其中一個survivor區,回收時將這兩個區中的存活物件複製到另外一個s區。預設情況eden區
垃圾收集器的種類及原理
1、Serial收集器:古老的單執行緒收集器,作用於新生代。單執行緒的意義並非僅僅是隻使用一條執行緒進行垃圾回收,更重要的是,在進行垃圾回收的時候,必須暫停其他所有的工作執行緒,因此,使用者體驗很不好。單實際上,Serial並不是一個一無是處的垃圾收集器,當虛擬機器執行在C
《深入理解java虛擬機器》讀書筆記(三)---- 垃圾回收演算法及垃圾收集器介紹
一、垃圾回收演算法 1、標記--清除演算法 標記--清除(Mark-Sweep)演算法,分為標記和清除兩個階段,首先標記出所有需要回收的物件,在標記完成後統一回收所有被標記的物件,這是最基礎的收集演算法,後續很多演算法都是基於這種思想進行設計的。 標記--清除演算法主要的不足有兩點:一個
JVM初探- 記憶體分配、GC原理與垃圾收集器
JVM記憶體的分配與回收大致可分為如下4個步驟: 何時分配 -> 怎樣分配 -> 何時回收 -> 怎樣回收. 除了在概念上可簡單認為new時分配外, 我們著重介紹後面的3個步驟: I. 怎樣分配- JVM記憶體分配策略 物件記憶體主要分配
JVM(HotSpot) 7種垃圾收集器的特點及使用場景
這裡討論的收集器基於JDK1.7Update 14之後的HotSpot虛擬機器,這個虛擬機器包含的所有收集器如下圖3-5所示: 上圖展示了7種作用於不同分代的收集器,如果兩個收集器之間存在連線,就說明它們可以搭配使用。 1.Serial收集器 Serial收集器是最基本、
【理解HotSpot虛擬機器】序列垃圾收集器Serial和Serial Old原理
上一篇GC垃圾收集器的對比分析分析和對比了JVM中常見的垃圾收集器,本篇先來探究序列垃圾收集器的原理。 1 Serial 收集器 Serial 收集器是在 DefNewGeneration 新生代上實現收集的,DefNewGeneration上分
7種JVM垃圾收集器特點,優劣勢、及使用場景
7種JVM垃圾收集器特點,優劣勢、及使用場景 常見的垃圾收集器有3類: 新生代垃圾收集器 1.Serial序列收集器-複製演算法 2.ParNew收集器-複製演算法 3.Parallel Scavenge(並行回收)收集器-複製演算
Java虛擬機器垃圾回收(三) 7種垃圾收集器:主要特點 應用場景 設定引數 基本執行原理
Java虛擬機器垃圾回收(三) 7種垃圾收集器 主要特點 應用場景 設定引數 基本執行原理 下面先來了解HotSpot虛擬機器中的7種垃圾收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Paralle
GC原理---垃圾收集器
image 記錄 watermark all 空間 ctime 方法 sem enter 垃圾收集器 如果說收集算法是內存回收的方法論,垃圾收集器就是內存回收的具體實現 Serial收集器 串行收集器是最古老,最穩定以及效率高的收集器,可能會產生較長的停頓,只使用一個線程
Java虛擬機器記憶體管理(二)--垃圾收集器及記憶體分配策略
概述 Java記憶體執行時區域的各個部分,其中程式計數器、虛擬機器棧、本地方法棧3個區域隨執行緒而生,隨執行緒而滅;棧中的棧幀隨著方法的進入和退出而有條不紊地執行著出棧和入棧操作。每一個棧幀中分配多少記憶體基本上是在類結構確定下來時就已知的(儘管在執行期會由JIT編
【JVM從小白學成大佬】5.垃圾收集器及記憶體分配策略
前面介紹了垃圾回收演算法,接下來我們介紹垃圾收集器和記憶體分配的策略。有沒有一種牛逼的收集器像銀彈一樣適配所有場景?很明顯,不可能有,不然我也沒必要單獨搞一篇文章來介紹垃圾收集器了。熟悉不同收集器的優缺點,在實際的場景中靈活運用,才是王道。 在開始介紹垃圾收集器前,我們可以劇透幾點: 根據不同分代的特點,收
JVM-垃圾收集器
執行 number nbsp 技術 操作 表示 響應 ati 整合 本篇主要介紹一下JVM的幾種垃圾收集器。其示意圖例如以下所看到的,上面的三個是新生代的收集器, 以下三個是老年代的收集器。當中G1收集器是能夠用於新生代和老年代的收集工作。 JVM垃圾收集器 1、S
【5】JVM-垃圾收集器
garbage 垃圾收集器 發展 access 表示 新生代 動態 導致 ren 通過學習了解到現在商用的JVM中的垃圾收集采用的是分代收集算法,即針對不同年代采用不同的收集算法。在JVM中,GC主要作用於堆內存中,堆內存又被劃分為新生代和老年代,由於新生代對象絕大多數是朝
深入理解JVM:垃圾收集器與內存分配策略
四種 內存回收 第一次 不可達 append test 方法 static hot 堆裏面存放著Java世界差點兒全部的對象實例,垃圾收集器在對堆進行回收前。第一件事情就是要確定這些對象之中哪些還存活,哪些已經死去。推斷對象的生命周期是否結束有下面幾種方
Head first java chapter 9構造器與垃圾收集器
運算 不同 垃圾 使用 log 特殊 返回 oid div 構造函數是一種特殊的函數。其主要功能是用來在創建對象時初始化對象, 即為v對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。構造函數與類名相同,可重載多個不同的構造函數。在JAVA
CMS垃圾收集器
mos use mvd gmv 資源 meta rtl 結構 mdk 一、CMS垃圾收集器介紹 眾所周知,在oracle公司的Hotspot的架構中,大體上采用分代回收的機制。其中出生代又采用了拷貝復制的方法。如果對象在初生代內存活超過一定次數之後,就可以晉升到老生代中,而
JVM(五)-垃圾收集算法和垃圾收集器
images 暫停 cell lol tsp 普通 最適 連線 begin 一、垃圾收集算法 (1)標記—清除算法 “標記-清除”(Mark-Sweep)算法,如它的名字一樣,算法分為“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,在標記完成後統一回收掉所有被標記
垃圾收集器與內存分配策略
使用 對象比較 內存空間 強引用 公司 enc 虛引用 我們 內存溢出 1. 垃圾收集器與內存分配策略 垃圾回收機制(Garbage Collection,GC),GC的歷史要比java悠久。1960年誕生於MIT的Lisp是第一個真正使用內存動態分配和垃圾收集技術
G1垃圾收集器和CMS垃圾收集器 (http://mm.fancymore.com/reading/G1-CMS%E5%9E%83%E5%9C%BE%E7%AE%97%E6%B3%95.html#toc_8)
異常 了解 訪問 標識 2.6 響應時間 ads sco 方法 參考來源 JVM 體系架構 堆/棧的內存分配 靜態和非靜態方法的內存分配 CMS 回收算法 應用場景 CMS 垃圾收集階段劃分(Collection Phases) CMS什麽時候啟動 CMS缺點
JVM垃圾收集器整理
聯網 特殊 initial java7 at-t 產生原因 client模式 無法找到 region 概述 垃圾收集器是jvm實現內存回收的具體實現。本次分享要介紹的7種垃圾收集器的作用區域及其之間的關系如下圖: 註: 如果2個垃圾收集器之間有連線,表示可以搭配使用 垃