【Java虛擬機】 垃圾回收器

了解了Java虛擬機垃圾回收算法一文中的內(nèi)容,我們來學習它們的具體是實現(xiàn)——垃圾回收器霍狰。
不用的廠商、不同版本的虛擬機都會提供不同的垃圾回收器缓待,用戶可以根據(jù)自己的場景需求配置要使用的垃圾回收器蚓耽。
學習垃圾回收器,需要明確一個思想:沒有最好的垃圾回收器旋炒,只有最合適的步悠。
了解垃圾回收器只為根據(jù)具體的應用場景選擇最合適的那一個。

Serial

Serial回收器是采用復制算法新生代回收器瘫镇。
Serial顧名思義鼎兽,是一個單線程的回收器答姥。
所謂單線程,指的是在垃圾回收階段谚咬,只使用一個線程去完成鹦付。同時回收過程會導致STW(“Stop The Word”)。(暫停其他所有線程择卦,表現(xiàn)為不對外提供服務)敲长。

STW帶來的糟糕的用戶體驗,一直是虛擬機開發(fā)者努力解決的問題秉继∑碓耄可以說后續(xù)的回收器都在致力于解決這個問題。

Serial的單線程作業(yè)尚辑,在當前多CPU的環(huán)境下顯得不是很高效辑鲤。但是單CPU環(huán)境下,Serial相比于其他回收器就會因為它沒有線程切換開銷而更加高效杠茬。

參數(shù)

-XX:+UseSerialGC:添加該參數(shù)使用Serial進行垃圾回收月褥。

ParNew

ParNew,Par表示Parallel并行瓢喉,即使用多線程進行垃圾回收宁赤,New表示新生代
ParNew是Serial的多線程版本灯荧,除使用多線程外礁击,其余與Serial一樣,也是使用復制算法逗载,同時實現(xiàn)了也共用了很多代碼哆窿。

參數(shù)

-XX:+UseParNewGC:使用ParNew進行垃圾回收。
-XX:ParallelGCThreads:指定線程數(shù)量厉斟。

Parallel Scavenge

Parallel Scavenge挚躯,新生代回收器,使用并行多線程復制算法回收擦秽。

相比于其他回收器码荔,Parallel Scavenge關注于吞吐量(吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾回收時間)),
其他回收器關注的是在垃圾回收階段的用戶線程的停頓時間感挥。
所以Parallel Scavenge更加適用于后臺計算類的場景缩搅,其他回收器適用于與用戶交互的場景。

參數(shù)

-XX:MaxGCPauseMillis:最大垃圾回收停頓時間触幼。設置過小硼瓣,會導致GC頻繁而降低吞吐量。
-XX:GCTimeRatio:垃圾回收時間占比,通過1/(1+N)計算堂鲤。
-XX:+UseAdptiveSizePolicy:GC自適應調(diào)節(jié)策略亿傅,開啟后不需要手動設置細節(jié)參數(shù)

Serial Old

Serial的老年代版本,單線程回收瘟栖,采用“標記-整理”算法狮荔。

主要用于虛擬機的Client模式下爷耀。
在Server模式下慧脱,與Parallel Scavenge搭配使用或者作為CMS回收器在發(fā)生Concurrent Mode Failure時的后備預案镜廉。

Parallel Old

Parallel Scavenge 的老年代版本,使用“標記-整理”算法寓涨。
Parallel Old 的出現(xiàn)取代了 Parallel Scavenge+Serial Old的組合敏晤,Parallel Scavenge+Parallel Old 的組合更大程度的利用的多CPU的硬件環(huán)境。

參數(shù)

-XX:+UseParallelOldGC:使用ParallelOld回收器缅茉;

CMS

CMS(Concurrent Mark Sweep)并發(fā)標記清理回收器,目標是獲取最短回收停頓時間男摧。適用于與用戶交互高頻的場景蔬墩。
老年代回收器,使用“標記-清除”算法耗拓。
所謂并發(fā)拇颅,指的是垃圾回收線程與用戶線程同時執(zhí)行(可能交替執(zhí)行,可能處于不同CPU上運行)乔询。
CMS的并發(fā)樟插,并不代表著不會導致STW。CMS分為4個步驟:初始標記竿刁,并發(fā)標記黄锤,重新標記,并發(fā)清除食拜,其中的初始標記和重新標記仍要STW鸵熟。

初始標記:STW,標記GC Roots能關聯(lián)的對象负甸。
并發(fā)標記:進行GC Roots Tracing過程流强。用戶程序在運行,不保證能標記所有對象呻待。
重新標記:STW打月,修正并發(fā)標記期間因程序運行到導致變動的標記對象。
并發(fā)清理:回收所有死亡對象蚕捉。

不足

? CPU敏感型奏篙。并發(fā)會占用CPU資源,導致程序變慢鱼冀,而CPU的數(shù)量會進一步影響到垃圾的回收與程序的運行报破。
? 浮動垃圾無法處理:浮動垃圾即并發(fā)清理階段產(chǎn)生的垃圾悠就,需要等到下一次GC進行清理。
? 可能出現(xiàn)Concurrent Mode Failure:浮動垃圾的存在充易,需要預留空間給程序運行梗脾。而當預留空間不足時,就會出現(xiàn)Concurrent Mode Failure盹靴。 這時會啟用Serial Old炸茧,而導致FullGC。
? 內(nèi)存碎片的產(chǎn)生:“標記-清理”算法產(chǎn)生了內(nèi)存碎片稿静,會在分配大對象時梭冠,導致FullGC提前。

參數(shù)

-XX:+UseConcMarkSweepGC:使用CMS收集器改备,使用該參數(shù)后會默認使用ParNew作為新生代回收器控漠。 -XX:+UseCMSCompactAtFullCollection:在進行FullGC時,開啟內(nèi)存碎片整理悬钳。 -XX:+CMSFullGCsBeforeCompaction:執(zhí)行一定次數(shù)的內(nèi)存不整理的FullGC后盐捷,下一次FullGC會進行內(nèi)存整理。 -XX:CMSInitiatingoccupanyFraction:內(nèi)存使用率的閾值默勾,達到閾值就進行GC碉渡。 -XX:ParallelCMSThreads:CMS線程數(shù)量

G1

G1將Java堆劃分為多個大小相等的region,并在后臺為每個region的價值大小維護一個優(yōu)先列表母剥。
每次回收時滞诺,根據(jù)允許的回收時間,回收價值最大的region(garbage-first的由來)环疼。

? G1不在需要與其他回收器結合來管理整個堆习霹。
? G1在概念上還保留著新生代與老年代的概念,但是在物理上已經(jīng)不存在炫隶,它們只是不同region的集合序愚。
? 由于回收管理的不在是整個堆,而是部分region等限,可以預測回收需要的時間爸吮。
? G1在整體上基于“標記-整理”算法,在region間基于“復制”算法望门。不會存在內(nèi)存碎片形娇。
? 并發(fā)與并行,充分利用多核多CPU環(huán)境筹误,來降低STW時間桐早。

初始標記:STW,標記GC Roots能關聯(lián)的對象。
并發(fā)標記:進行GC Roots Tracing過程哄酝,找出存活對象友存。
最終標記:STW,修正并發(fā)標記期間因程序運行到導致變動的標記對象陶衅。
篩選回收:對各個region的價值進行排序屡立,根據(jù)用戶期望的GC停頓時間進行回收。

參數(shù)

-XX:+UseG1GC:使用G1收集器
-XX:InitiatingHeapOccupancyPercent:堆的占用率搀军,當達標時膨俐,開始并發(fā)標記。
-XX:MaxGCPauseMillis:最大的停頓時間罩句。
-XX:G1HeapRegionSize:設置region大小焚刺。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市门烂,隨后出現(xiàn)的幾起案子乳愉,更是在濱河造成了極大的恐慌,老刑警劉巖屯远,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾委,死亡現(xiàn)場離奇詭異,居然都是意外死亡氓润,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門薯鳍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咖气,“玉大人,你說我怎么就攤上這事挖滤”老” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵斩松,是天一觀的道長伶唯。 經(jīng)常有香客問我,道長惧盹,這世上最難降的妖魔是什么乳幸? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮钧椰,結果婚禮上粹断,老公的妹妹穿的比我還像新娘。我一直安慰自己嫡霞,他們只是感情好瓶埋,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般养筒。 火紅的嫁衣襯著肌膚如雪曾撤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天晕粪,我揣著相機與錄音挤悉,去河邊找鬼。 笑死兵多,一個胖子當著我的面吹牛尖啡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剩膘,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衅斩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怠褐?” 一聲冷哼從身側響起畏梆,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奈懒,沒想到半個月后奠涌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡磷杏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年溜畅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片极祸。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡慈格,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遥金,到底是詐尸還是另有隱情浴捆,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布稿械,位于F島的核電站选泻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏美莫。R本人自食惡果不足惜页眯,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厢呵。 院中可真熱鬧餐茵,春花似錦、人聲如沸述吸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至道批,卻和暖如春错英,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隆豹。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工椭岩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璃赡。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓判哥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碉考。 傳聞我的和親對象是個殘疾皇子塌计,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容