直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景
直通BAT之JVM系列
直通BAT必考題系列:JVM的4種垃圾回收算法、垃圾回收機制與總結
直通BAT必考題系列:深入詳解JVM內存模型與JVM參數詳細配置
今天繼續JVM的垃圾回收器詳解,如果說垃圾收集算法是JVM內存回收的方法論,那么垃圾收集器就是內存回收的具體實現。
常見的垃圾收集器有3類:
1.新生代的收集器包括:
2.老年代的收集器包括:
3.回收整個Java堆(新生代和老年代)
今天我們詳細談談以上7種垃圾收集器的優劣勢和使用場景。
新生代垃圾收集器
1.Serial串行收集器-復制算法
Serial收集器是新生代單線程收集器,優點是簡單高效,算是最基本、發展歷史最悠久的收集器。它在進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集完成。
Serial收集器依然是虛擬機運行在Client模式下默認新生代收集器,對于運行在Client模式下的虛擬機來說是一個很好的選擇。
2.ParNew收集器-復制算法
ParNew收集器是新生代并行收集器,其實就是Serial收集器的多線程版本。
除了使用多線程進行垃圾收集之外,其余行為包括Serial收集器可用的所有控制參數、收集算法、Stop The Worl、對象分配規則、回收策略等都與Serial 收集器完全一樣。
3.Parallel Scavenge(并行回收)收集器-復制算法
Parallel Scavenge收集器是新生代并行收集器,追求高吞吐量,高效利用 CPU。
該收集器的目標是達到一個可控制的吞吐量(Throughput)。所謂吞吐量就是CPU用于運行用戶代碼的時間與CPU總消耗時間的比值,即 吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)
停頓時間越短就越適合需要與用戶交互的程序,良好的響應速度能提升用戶體驗,而高吞吐量則可用高效率地利用CPU時間,盡快完成程序的運算任務,主要適合在后臺運算而不需要太多交互的任務。
老年代垃圾收集器
1.Serial Old 收集器-標記整理算法
Serial Old是Serial收集器的老年代版本,它同樣是一個單線程(串行)收集器,使用標記整理算法。這個收集器的主要意義也是在于給Client模式下的虛擬機使用。
如果在Server模式下,主要兩大用途:
(1)在JDK1.5以及之前的版本中與Parallel Scavenge收集器搭配使用
(2)作為CMS收集器的后備預案,在并發收集發生Concurrent Mode Failure時使用
2.Parallel Old 收集器-標記整理算法
Parallel Old 是Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。這個收集器在1.6中才開始提供。
3.CMS收集器-標記整理算法
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。
目前很大一部分的Java應用集中在互聯網站或者B/S系統的服務端上,這類應用尤其重視服務器的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS收集器就非常符合這類應用的需求。
CMS收集器是基于“標記-清除”算法實現的,它的運作過程相對前面幾種收集器來說更復雜一些,整個過程分為4個步驟:
(1)初始標記
(2)并發標記
(3)重新標記
(4)并發清除
其中,初始標記、重新標記這兩個步驟仍然需要“Stop The World”
CMS收集器主要優點:
CMS三個明顯的缺點:
(1)CMS收集器對CPU資源非常敏感。CPU個數少于4個時,CMS對于用戶程序的影響就可能變得很大,為了應付這種情況,虛擬機提供了一種稱為“增量式并發收集器”的CMS收集器變種。
(2)CMS收集器無法處理浮動垃圾,可能出現“Concurrent Mode Failure”失敗而導致另一次Full GC的產生。在JDK1.5的默認設置下,CMS收集器當老年代使用了68%的空間后就會被激活。
(3)CMS是基于“標記-清除”算法實現的收集器,手機結束時會有大量空間碎片產生。空間碎片過多,可能會出現老年代還有很大空間剩余,但是無法找到足夠大的連續空間來分配當前對象,不得不提前出發FullGC。
新生代和老年代垃圾收集器
1.G1收集器-標記整理算法
JDK1.7后全新的回收器, 用于取代CMS收集器。
G1收集器的優勢:
G1收集器的運作大致可劃分為一下步驟:
G1收集器的階段分以下幾個步驟:
1、初始標記(它標記了從GC Root開始直接可達的對象)
2、并發標記(從GC Roots開始對堆中對象進行可達性分析,找出存活對象)
3、最終標記(標記那些在并發標記階段發生變化的對象,將被回收)
4、篩選回收(首先對各個Regin的回收價值和成本進行排序,根據用戶所期待的GC停頓時間指定回收計劃,回收一部分Region)
JVM垃圾收集器總結
本文主要介紹了JVM中的垃圾回收器,主要包括串行回收器、并行回收器以及CMS回收器、G1回收器。他們各自都有優缺點,通常來說你需要根據你的業務,進行基于垃圾回收器的性能測試,然后再做選擇。下面給出配置回收器時,經常使用的參數:
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :新生代使用并行回收收集器,更加關注吞吐量
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:設置用于垃圾回收的線程數
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:設定CMS的線程數量
-XX:+UseG1GC:啟用G1垃圾回收器
你可能也喜歡:
總結
以上是生活随笔為你收集整理的直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud Alibaba
- 下一篇: Redis系列教程(九):Redis的内