JVM記憶體管理之垃圾蒐集器簡介

2022-09-18 12:24:12 字數 2062 閱讀 6595

上一章我們已經**過gc的各個演算法,那麼垃圾蒐集器是什麼呢?

通俗的講,使用程式語言將演算法實現出來,產生的程式就是垃圾蒐集器了。既然談到了程式語言的實現,那麼在討論垃圾蒐集器的時候,就已經涉及到具體的虛擬機器實現了。

或許有不少做j**a開發的猿友還不知道,我們平時使用的jdk中,預設的jvm是hotspot,換句話說,我們大部分時候使用的jvm都是hotspot的實現版本,因此,本次lz討論垃圾蒐集器都是基於hotspot版jvm來進行的,請各位猿友要知曉這一點。

更直觀的,我們可以在我們平時開發的機子上,輸入j**a -version來檢視jvm的版本,相信大部分猿友對這個命令都不陌生吧,lz的機子截圖如下。

上面我們已經提到,垃圾蒐集器實際就是演算法的程式語言實現。既然牽扯到程式語言,那麼必然離不開執行緒,而且我們在前面講解演算法的時候也一直假設是一條gc執行緒在做著gc的事情。

因此,垃圾蒐集器大致分為以下三類。

序列蒐集器(serial collector):它只有一條gc執行緒,且就像前面說的,它在執行的時候需要暫停使用者程式(stop the world)。

並行蒐集器(parallel collector):它有多條gc執行緒,且它也需要暫停使用者程式(stop the world)。

併發蒐集器(concurrent collector):它有一條或多條gc執行緒,且它需要在部分階段暫停使用者程式(stop the world),部分階段與使用者程式併發執行。

看完上面的定義,相信有一部分猿友已經蒙了,一會單執行緒,一會多執行緒,一會序列,一會並行,一會併發,這都神馬玩意?

單執行緒和多執行緒就不必多說了,這個很好理解,序列與並行也比較好理解,難於分辨的就是並行(parallel)與併發(concurrent)。

對於很多有關併發的解釋,lz覺得有乙個最貼切。它是這麼解釋的,併發就是兩個任務a和b需要相互獨立的執行,並且a任務先開始後,b任務在a任務結束之前開始了

併發本身是比較好理解的,那麼它與並行的關係與區別是什麼呢?

事實上,並行是併發的一種實現方式。lz覺得這麼說各位可能會更好理解,當然,並行並不是併發的唯一實現方式,還有一種就是我們所熟悉的時間片切換。也就是a任務執行一會,b任務執行一會,交替執行。

並行必須在多核多處理器或者分布式系統(本質還是多核多處理器)的前提下才能發生,而交替執行或者說時間片切換是在單核的處理器上發生的

我們上面已經簡單**了垃圾蒐集器的分類,在hotspotjvm中,每乙個種類的垃圾蒐集器都有對應的實現,如下。

並行蒐集器的實現:parnew(用於新生代,採用複製演算法)、parallel sc**enge(用於新生代,採用複製演算法)、parallel old(用於年老代,採用標記/整理演算法)

併發蒐集器的實現:concurrent mark sweep[cms](用於年老代,採用標記/清除演算法)

可以看到,上面每一種垃圾蒐集器都是針對不同記憶體區域所設計的,因為它們採用的演算法不同,凡是用於新生代的都是使用的複製演算法,而用於年老代的都是使用的標記/清除或者標記/整理演算法。

在實際應用中,我們需要給jvm的新生代和年老代分別選擇垃圾蒐集器,可以看到無論是新生代還是年老代都分別有三種實現,換句話說,我們應該有3*3=9種選擇。但是,事實並非如此。

事實上,這六種垃圾蒐集器只有六種選擇,因為有的垃圾蒐集器由於具體實現的方式等一系列原因無法在一起工作,如下圖。

針對上圖,紅的就是序列蒐集器,綠的是並行蒐集器,唯一乙個黃的是併發蒐集器。上面三個是新生代的蒐集器,下面三個是年老代的蒐集器。兩者之間有連線,則表示兩者可以配合工作。

這六種組合並沒有說哪個組合最強,哪個組合最弱,還是那句話,只有最合適的,沒有最好的。因此這就需要我們對每一種組合有一定的認識,才能在使用的時候選擇更適合的垃圾蒐集器。

本次大致介紹了一下六種垃圾蒐集器,以及它們的關係。每一種垃圾蒐集器的特點與執行方式,我們在下一章再一起**。

JVM之垃圾收集器

垃圾 演算法 標記 清除 先標記後統一清除 缺點 1.執行效率不穩定 表現在假設j a堆中存在大量需要被 物件,此時標記 清除操作執行效率隨著物件的數量增加而降低 2.產生大量碎片化空間,導致記憶體不連續,無法為大物件分配空間。標記 複製 將記憶體分為兩塊,每次只使用一塊,當這塊記憶體用完了,就將還...

JVM垃圾收集器與記憶體分配策略

軟引用弱引用 虛引用老年代 主動中斷 xx maxgcpausemillis 設定最大停頓時間 毫秒 xx gctimeratio 設定吞吐量大小 0 100 xx useadaptivesizepolicy 配合最大停頓時間,或吞吐量來使用.僅需要設定 xmx 2.併發標記 3.重新標記 4.併發...

JVM垃圾收集器之CMS收集器

cms concurrent mark sweep 收集器是一種以獲取最短 停頓時間為目標的收集器。1 cms使用的演算法 cms使用的演算法為 標記 清除 演算法 2 執行過程4步驟 a 初始標記 cms initial mark b 併發標記 cms concurrent mark c 重新標記...