JVM垃圾回收器詳解(7種垃圾回收器圖解)

2024年2月6日 21点热度 0人点赞

大傢好,我是mikechen。

JVM垃圾回收器是Java面試經常被問到的問題,下面重點詳解常見的幾種JVM垃圾回收器@mikechen

本篇已經收納於mikechen創作的《阿裡架構師進階專題合集》裡面。

Serial串行收集器

Serial垃圾回收器是最基本的垃圾回收器,它使用單個線程進行垃圾回收。

如下圖所示:

在執行垃圾回收時,Serial垃圾回收器會暫停所有應用程序線程,直到垃圾回收完成。

由於Serial垃圾回收器是單線程的,因此它的優點是簡單且占用資源較少,它適用於小型應用程序,例如移動應用程序和桌面應用程序。

Parallel並行收集器

與Serial垃圾回收器不同,Parallel垃圾回收器使用多個線程來加速垃圾回收過程,從而提高了應用程序的性能。

如下圖所示:

由於Parallel垃圾回收器使用多線程,因此它可以在多個CPU上並發執行垃圾回收,從而提高了垃圾回收的效率。

Parallel垃圾回收器適用於中等大小的應用程序,特別是那些需要高吞吐量的應用程序,例如:Web應用程序和大規模企業應用程序。

CMS收集器

CMS(Concurrent Mark Sweep)垃圾回收器,是一種使用標記清除算法的低暫停時間垃圾回收器,CMS收集器主要用於收集老年代的垃圾。

CMS垃圾回收器的工作方式是分為兩個階段:標記階段和清除階段。

如下圖所示:

在標記階段:CMS垃圾回收器會使用多個線程來標記Java堆內存中的垃圾對象。

與此同時,應用程序可以繼續運行,因此垃圾回收過程不會暫停應用程序的執行。

在清除階段:CMS垃圾回收器會清除已標記的垃圾對象,並回收內存空間。

G1垃圾回收器

G1垃圾收集器采用的是分代收集的思想,將Java堆內存分成多個大小相等的區域,每個區域被稱為一個Region。

如下圖所示:

1)G1堆內存結構

默認把堆內存按照2048份均分,大小區間最小1M、最大32M,總之是2的冪次方。

2)G1堆內存分配

每個Region被標記了E、S、O和H,這些區域在邏輯上被映射為Eden,Survivor和老年代。

Humongous區域是為了那些存儲超過50%標準region大小的對象而設計的,它用來專門存放巨型對象。

如果一個H區裝不下一個巨型對象,那麼G1會尋找連續的H分區來存儲。

G1垃圾回收器的優點是能夠在垃圾回收期間減少應用程序的暫停時間,同時也能夠避免內存碎片問題。

G1垃圾回收器它適用於那些需要高可預測性和低暫停時間的大型應用程序,例如金融交易系統等。

ZGC垃圾收集器

ZGC也稱為The Z Garbage Collector,ZGC垃圾收集器是JDK 11中推出的一款追求極致低延遲的性質的JVM垃圾收集器。

與CMS中的ParNew和G1類似,ZGC也采用標記復制算法,不過ZGC對該算法做了重大改進。

ZGC收集器采用了讀屏障技術,這意味著在進行垃圾收集時,ZGC可以非常快速地掃描整個Java堆內存,同時幾乎不會產生停頓。

ZGC垃圾回收器的優點是能夠在垃圾回收期間減少應用程序的暫停時間,並在不影響吞吐量的情況下回收大量內存。

ZGC垃圾回收器適用於那些需要低延遲和大內存回收能力的應用程序,例如內存密集型應用程序和大數據應用程序。

Epsilon垃圾收集器

Epsilon垃圾回收器是一種實驗性的垃圾回收器,它的設計目標是完全消除垃圾回收的暫停時間。

Epsilon垃圾回收器的優點是能夠完全消除垃圾回收的暫停時間,從而提高應用程序的性能和可預測性。

Epsilon適用於那些需要極高性能和可預測性的應用程序,例如高性能計算和科學計算等領域。

要啟用了 Epsilon GC 的 JVM 上啟動應用程序或微服務,請包括以下 JVM 選項:

-XX: UnlockExperimentalVMOptions -XX: UseEpsilonGC

總之,Epsilon垃圾回收器是一種完全消除垃圾回收暫停時間的實驗性垃圾回收器,適用於需要極高性能和可預測性的應用程序。

Shenandoah垃圾收集器

Shenandoah垃圾收集器於JDK 12中首次引入,主要針對需要大內存和低延遲的應用場景。

Shenandoah垃圾收集器的主要優點在於它可以在很短的停頓時間內完成垃圾回收操作,並且可以處理非常大的堆內存。

以上

本篇已經收納於mikechen創作的《阿裡架構師進階專題合集》裡面。