垃圾收集器你不知道的點

程序員小迷 2024-05-05 12:36:57

一、Serial

1.新生代,複制算法 ,單線程,簡單高效,適合內存不大的情況。

2.在進行垃圾回收時,必須停止其他所有工作線程,直到垃圾回收結束。

二、ParNew

1.新生代,複制算法, 並行的多線程收集器。

2.ParNew垃圾收集器是Serial收集器的多線程版本,搭配CMS垃圾回收器的首選 。

三、Parallel Scavenge

1.新生代,複制算法 ,並行的多線程收集器 ,吞吐量優先收集器 。

2.類似ParNew,更加關注吞吐量,達到一個可控制的吞吐量。

3.本身是Server級別多CPU機器上的默認GC方式,主要適合後台運算不需要太多交互的任務。

四、Serial Old

Serial收集器的老年代版本,標記整理算法 , 單線程 ,Client模式下虛擬機使用。

五、Parallel Old

1.老年代,標記整理算法 ,並行的多線程收集器 。

2.Parallel Scavenge收集器的老年代版本,爲了配合Parallel Scavenge的面向吞吐量的特性而開發的對應組合,在注重吞吐量以及CPU資源敏感的場合采用 。

3.Parallel Scavenge(Parallel GC)/Parallel Old

1)關注吞吐量的垃圾收集器,高吞吐量可以高效率地利用CPU時間,盡快完成程序的運算任務,主要適合在後台運算而不需要太多交互的任務。

2)所謂吞吐量就是CPU用于運行用戶代碼的時間與CPU總消耗時間的比值,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)。例如:虛擬機總共運行了100分鍾,其中垃圾收集花掉1分鍾,那吞吐量就是99%。

六、CMS

1.全稱Concurrent Mark Sweep。老年代,標記清除算法 ,並行與並發收集器。盡可能的縮短垃圾收集時用戶線程停止時間。

2.CMS收集器是一種以獲取最短回收停頓時間爲目標的收集器。目前很大一部分的Java應用集中在互聯網網站或者B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS收集器就非常符合這類應用的需求。互聯網後端目前CMS是主流的垃圾回收器。

3.從名字(包含"Mark Sweep")上就可以看出,CMS收集器是基于"標記—清除"算法實現的,它的運作過程相對于前面幾種收集器來說更複雜一些,整個過程分爲4個步驟,包括:

1)初始標記-短暫,僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快。

2)並發標記-和用戶的應用程序同時進行,進行GC Roots Tracing的過程。

3)重新標記-短暫,爲了修正並發標記期間因用戶程序繼續運作而導致標記産生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比並發標記的時間短。

4)並發清除。

由于整個過程中耗時最長的並發標記和並發清除過程收集器線程都可以與用戶線程一起工作,所以,從總體上來說,CMS收集器的內存回收過程是與用戶線程一起並發執行的。

4.使用-XX:+UseConcMarkSweepGC 標記時,表示新生代使用ParNew,老年代使用CMS。

5.浮動垃圾:由于CMS並發清理階段用戶線程還在運行著,伴隨程序運行自然就還會有新的垃圾不斷産生,這一部分垃圾出現在標記過程之後,CMS無法在當次收集中處理掉它們,只好留待下一次GC時再清理掉。這一部分垃圾就稱爲"浮動垃圾"。

6.缺點在于:

1)會産生內存碎片 。

2)需要更多cpu資源 。

3)浮動垃圾問題,需要更大的堆空間 。

七、G1

1.全稱Garbage First。跨新生代和老年代。標記整理 + 化整爲零 ,並行與並發收集器 。適用于具有大內存容量和多核心處理器的機器。

2.在JDK1.7正式引入,采用分區回收的思維,將堆內存劃分爲多個大小相等的區域,優先回收價值最大的區域,基本不犧牲吞吐量的前提下完成低停頓的內存回收。可預測的停頓是其最大的優勢。面向服務端應用的垃圾回收器,目標爲取代CMS 。

八、ZGC

1.全稱Z Garbage Collector。在JDK11引入。多線程環境,適用需要低延遲和大量內存(可達TB級別)的應用。

2.一種可擴展的低延遲垃圾收集器,使用彩色指針(幾乎可以達到停頓時間不超過10毫秒的目標)和負載屏障來實現並發標記-整理算法。

九、引申

1.並行收集器:垃圾收集的多線程的同時進行,此時用戶線程處于等待狀態。

2.並發收集器:垃圾收集的多線程和應用的多線程同時進行。

3.吞吐量=運行用戶代碼時間/(運行用戶代碼時間+ 垃圾收集時間)

垃圾收集時間= 垃圾回收頻率 * 單次垃圾回收時間

微風不燥,陽光正好,你就像風一樣經過這裏,願你停留的片刻溫暖舒心。

我是程序員小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等編程技術的技巧經驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們爲您提供幫助的最大動力。

歡迎關注。助您在編程路上越走越好!

0 阅读:3

程序員小迷

簡介:致力于Android、C等編程技術的技巧經驗分享