詳解常見的垃圾收集器

2022-09-20 01:33:13 字數 1875 閱讀 8125

常見的垃圾收集器分為序列、吞吐量優先和響應時間優先三種。

設定引數為-xx:+useserialgc = serial + serialold,serial分為兩種,serial工作在新生代,使用複製演算法;serialold工作在老年代,採用標記整理演算法。

假設有4核cpu執行四個執行緒,在gc時物件的位址可能會發生變化,要發生gc時,讓所有使用者執行緒到達乙個安全點停下來,垃圾**執行緒開始**,**期間其他執行緒被阻塞。如果使用者執行緒不停下來,gc時物件位址變化了,就會產生問題。垃圾**執行緒結束以後,其他執行緒再開始執行。適合堆記憶體小、個人電腦使用

這是1.8 預設的gc器 ,主要設定的引數為:

-xx:+useparallelgc ~ -xx:+useparalleloldgc新生複製,老年標記整理

-xx:+useadaptivesizepolicy自適應調整新生代大小

-xx:gctimeratio=ratio公式 1 / (1 + ratio) ratio預設值是99 ,也就是工作100分鐘內,只有1分鐘可以用於垃圾**。如果達不到整個目標,parallelgc會調增大堆的大小, 垃圾**次數減少 ,以此來提高吞吐量。一般ratio設定為19。

-xx:maxgcpausemillis=ms最大暫停時間也就是垃圾**的時間,預設200ms

-xx:parallelgcthreads=n控制垃圾**執行緒數量

工作流程與序列的區別是開啟多個垃圾**執行緒來**,數量由電腦的cpu核數決定,同樣使用者執行緒被阻塞。特點是多執行緒收集,讓單位時間內stw時間最短 即收集次數少時間可以長點,比如一小時內2次,一次0.2秒。

設定的引數為:

-xx:+useconcmarksweepgc ~ -xx:+useparnewgc ~ serialold --> cms工作在老年代,使用標記清除演算法。parnew工作在新生地,parnew是serial的多執行緒版本。但cms有時候會發生併發失敗問題,這時候老年代垃圾**器變為serialold 。

-xx:parallelgcthreads=n ~ -xx:concgcthreads=threads:併發執行緒數一般設定為並行執行緒數的1/4,比如4核就設定成1。1個執行緒來做垃圾**,另外3個繼續執行使用者執行緒。

-xx:cmsinitiatingoccupancyfraction=percent 執行cms**的記憶體佔比,值越小執行垃圾**時機越早。

-xx:+cmssc**engebeforeremark 在重新標記前做一些新生代的垃圾**。因為重新標記時,新生代的物件會引用老年代的物件,標記時需要掃瞄整個堆,然後通過新生代引用掃瞄到老年代物件並作可達性分析。這種場景下新生代物件非常多並且很多會作為垃圾物件被**,再根據新生代物件引用找到老年代物件;相當於在**之前多做了無用的查詢,這時可以使用這個引數,使用新生代存活物件變少,減輕重新標記的壓力。

工作流程是假設4核cpu並行執行4個執行緒。老年代記憶體不足,使用者執行緒在安全點停下來了。先進行初始標記,標記一些gcroots物件,這時候使用者執行緒被阻塞。下一步是併發標記,使用者執行緒和垃圾**執行緒併發執行。第三步是重新標記,因為併發標記時使用者執行緒繼續執行,可能會產生新的物件,或者改變物件的一些引用。最後是併發清理,但這次清理不能**同時產生的垃圾物件(浮動垃圾),浮動垃圾只能等到下一次垃圾**時再清理,使用上面第三個引數調整。

cms使用的標記清楚演算法,自然會產生大量記憶體碎片。將來分配物件時,當新生代記憶體不夠時,老年代記憶體由於碎片過多也不足,就會造成併發失敗,這時候垃圾**器會退化為serialold,垃圾**時間會劇增。

JVM垃圾收集器之CMS收集器

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

JVM的垃圾收集器

parnew收集器 parnew相比serial,則是較多的執行在server模式下的虛擬機器中首選的新生代收集器。而且還有乙個重要的原因,除了serial外,目前只有他能與cms收集器 jdk1.5推出,是hotspot第一款真正意義上的併發收集器 搭配工作。parnew可以使用 xx paral...

垃圾收集器(五) G1收集器

初始標記,標記gc roots直接關聯的物件,新增tams標記 兩個指標 stw 併發標記,從gc roots沿著引用關係查詢,如果使用者執行緒同時修改了引用關係,新增satb標記 此時的新物件分配到tams標記之外的區域 併發。最終標記 處理satb標記,stw 篩選 按照 價值進行 對於乙個re...