Java虚拟机垃圾收集器初步学习
Java虛擬機—垃圾收集器
1.概述
如果說收集算法是內存回收的方法論,那么垃圾收集器就是內存回收的具體實現。
? ? 這里討論的收集器基于JDK 1.7 Update 14之后的HotSpot虛擬機(在這個版本中正式提供了商用的G1收集器,之前G1仍處于實驗狀態)。
1.1 垃圾收集器組合
這個虛擬機包含的所有收集器如圖所示:
? ? ?
(A)圖3-5展示了7種作用于不同分代的收集器:
Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;
(B)虛擬機所處的區域,則表示它是屬于新生代收集器還是老年代收集器;
? 新生代收集器:Serial、ParNew、Parallel Scavenge;
? 老年代收集器:Serial Old、Parallel Old、CMS;
? 整堆收集器:G1;
(C)如果兩個收集器之間存在連線,就說明它們可以搭配使用。
Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scanvenge/Parallel Old、G1;
(D)其中Serial Old作為CMS出現“Concurrent Mode Failure”失敗后的后備預案。
1.2 Minor GC和Full GC的區別
Minor GC:又稱新生代GC,指發生在新生代的垃圾收集動作;
Full GC:又稱為Major GC或老年代GC,指發生在老年代的GC;出現Full GC經常會伴隨至少一次的Minor GC(不是絕對,Parallel Scavenge收集器就可以選擇設置Major GC策略);
2. 新生代收集器?
2.1 Serial收集器?
Serial 收集器是最基本、發展歷史最悠久的收集器,曾經(在JDK1.3.1之前)是虛擬機新生代收集的唯一選擇,使用復制算法。
Serial收集器依然是虛擬機運行在Client模式下的默認新生代收集器。
2.2 ParNew收集器?
ParNew(ParNew是parallel new的簡寫)收集器其實就是Serial收集器的多線程版本,除了使用多條線程進行垃圾收集之外,其余行為包括Serial收集器可用的所有控制參數(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、對象分配規則、回收策略等都與Serial收集器完全一樣,也同樣使用復制算法,在實現上,這兩種收集器也共用了相當多的代碼。
2.3 Parallel Scanvenge收集器?
Parallel Scavenge收集器是一個新生代收集器,它也是使用復制算法的收集器,又是并行的多線程收集器。
Parallel Scavenge收集器的特點是它的關注點與其他收集器不同,CMS等收集器的關注點是盡可能地縮短垃圾收集時用戶線程的停頓時間,而Parallel Scavenge收集器的目標則是達到一個可控制的吞吐量(Throughput)。
Parallel Scavenge收集器提供了兩個參數用于精確控制吞吐量,分別是控制最大垃圾收集停頓時間的 -XX:MaxGCPauseMillis參數以及直接設置吞吐量大小的-XX:GCTimeRatio參數。
3. 老年代收集器
3.1 Serial Old收集器?
Serial Old是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用“標記-整理”算法。這個收集器的主要意義也是在于給Client模式下的虛擬機使用。
3.2 Parallel Old收集器?
? Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。
直到Parallel Old收集器出現后,“吞吐量優先”收集器終于有了比較名副其實的應用組合,在注重吞吐量以及CPU資源敏感的場合,都可以優先考慮Parallel Scavenge加Parallel Old收集器。
3.3 CMS收集器?
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的Java應用集中在互聯網站或者B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS收集器就非常符合這類應用的需求。
4. 整堆收集器
4.1 G1收集器
G1(Garbage-First)收集器是當今收集器技術發展的最前沿成果之一。
G1是一款面向服務端應用的垃圾收集器。HotSpot開發團隊賦予它的使命是(在比較長期的)未來可以替換掉JDK 1.5中發布的CMS收集器。
G1收集器的運作大致可劃分為以下幾個步驟:
初始標記(Initial Marking)
并發標記(Concurrent Marking)
最終標記(Final Marking)
篩選回收(Live Data Counting and Evacuation)
總結
以上是生活随笔為你收集整理的Java虚拟机垃圾收集器初步学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java虚拟机内存模型初步学习
- 下一篇: C++对象内存模型学习