先說個(gè)關(guān)系概念,垃圾回收的算法是邏輯概念的定義,用于規(guī)范垃圾回收器實(shí)現(xiàn)方的一些行為,而垃圾回收器就是實(shí)現(xiàn)這些算法的工具,這些工具大概是一系列的 C++ 的類以及其實(shí)現(xiàn)的一些對(duì)應(yīng)回收算法。

基本上我們常用的垃圾回收算法對(duì)于堆空間都會(huì)有 分代 這一概念,通常來說分為 年輕代 和 老年代

年輕代又下分 eden 區(qū) 和 survive0 和 survive1 區(qū)。對(duì)于一個(gè)新的對(duì)象一般來說會(huì)先進(jìn)入年輕代的 eden 區(qū),在對(duì)象的對(duì)象頭 Mark Word 中會(huì)記錄其分代年齡,大是 15 (只給了 4 bit 位來存),默認(rèn)也是 15。
通常我們說 GC 的時(shí)候又分為 年輕代的 GC 即 young gc 和 老年代的 GC 即 full gc,一般來說 young gc 耗時(shí)遠(yuǎn)低于 full gc 。我們優(yōu)化堆空間分配的過程就是要盡量避免 full gc 的過程。
在 young gc 的過程中,會(huì)對(duì)年輕代區(qū)域的對(duì)象進(jìn)行清理回收,存活下來的由 eden 進(jìn)入 s0 ,或者由 s0 進(jìn)入 s1 (或者 s1 進(jìn)入 s0 這個(gè)是標(biāo)記復(fù)制的過程)
每次 young gc 存活下來的對(duì)象分代年齡就會(huì) +1,當(dāng)達(dá)到 15 時(shí)(這個(gè)可以配置)。會(huì)將其移進(jìn)老年代,不在參與之后的 young gc
這意味著老年代的對(duì)象一般應(yīng)該是存活時(shí)間較長(zhǎng)的對(duì)象。
9
基本的回收算法標(biāo)記復(fù)制
標(biāo)記復(fù)制,準(zhǔn)備兩部分區(qū)域,這兩部分區(qū)域?qū)嶋H使用只會(huì)用一部分,另一部分作為待復(fù)制空間。在垃圾回收過程中,將所有非垃圾對(duì)象直接復(fù)制到另一區(qū)域,本區(qū)域清空。 此算法清理速度較快,但空間利用率較低。

標(biāo)記清理
標(biāo)記清理算法比較暴力,標(biāo)記好垃圾對(duì)象后直接將垃圾對(duì)象刪除,這個(gè)速度也是很快的,但是會(huì)產(chǎn)生較多的內(nèi)存碎片,進(jìn)而可能影響后續(xù)的空間分配
標(biāo)記整理
標(biāo)記整理算法相對(duì)于標(biāo)記清理算法多了一步整理,這不整理會(huì)將清理后碎片化的空間整理為連續(xù)空間,當(dāng)然付出的代價(jià)是整理的耗時(shí)。
Serial -XX:+UseSerialGC -XX:+UseSerialOldGC
Serial 收集器是最基礎(chǔ)的垃圾收集器,其收集過程為單線程收集,適用于單核 CPU ,或者垃圾回收異常情況的備選方案,邏輯簡(jiǎn)單高效。
該收集器在垃圾回收過程中會(huì)全程 STW (Stop The Word 僅垃圾回收線程工作,其他線程暫停,即用戶服務(wù)不可用)
年輕代使用算法:標(biāo)記復(fù)制
老年代使用算法:標(biāo)記整理
Parallel -XX:+UseParallelGC(年輕代),-XX:+UseParallelOldGC(老年代)
Parallel 相當(dāng)于是 Serial 的多線程版,多線程收集效率更高 STW 時(shí)間更短,適用于多核 CPU, 4G 左右內(nèi)存回收都是 OK 的。
年輕代使用算法:標(biāo)記復(fù)制
老年代使用算法:標(biāo)記整理
進(jìn)階常用垃圾收集器 ParNew + CMS & G1ParNew -XX:+UseParNewGC
這個(gè)玩意,和 Parallel 是一樣的,它的誕生是為了兼容配合 CMS 進(jìn)行垃圾收集,CMS 是老年代的垃圾收集器,它只負(fù)責(zé)老年代的垃圾收集。
CMS
重頭戲,CMS 是 Concurrent Mark Sweep 并發(fā)標(biāo)記清除 ,CMS 進(jìn)行垃圾回收分以下步驟
CMS 對(duì)于 8G 以內(nèi)的內(nèi)存處理表現(xiàn)良好,高于 8G 推薦使用 G1
大家應(yīng)該看出來了,垃圾收集器的迭代在于想優(yōu)化 STW 的時(shí)間,使其盡量短或者可控
G1 我公司線上服務(wù)就配置的這個(gè)
Garbage First 這個(gè)適用于大內(nèi)存的垃圾收集 32G 以內(nèi)效果比較好 (PS 不建議內(nèi)存分配超過 32G 內(nèi)存,否則默認(rèn)的指針壓縮將會(huì)失效)
并且 G1 在區(qū)域劃分上進(jìn)行了改變,它將整個(gè)堆空間劃分為多個(gè) Region 區(qū)域默認(rèn)是堆大小除以 2048,而分代的區(qū)域不再是固定的區(qū)域,而是隨著垃圾收集動(dòng)態(tài)調(diào)整。并增加了大對(duì)象區(qū)的概念,如果一個(gè)對(duì)象被認(rèn)定為大對(duì)象(超出 Region 區(qū)的 50%)則直接放到大對(duì)象區(qū) Humongous 此區(qū)域會(huì)在 full gc 時(shí)回收
G1 垃圾回收對(duì)于 CMS 的優(yōu)點(diǎn)就是可控的 STW 時(shí)間,并且因?yàn)闆]有物理隔離年輕代、老年代、存活區(qū),G1 的所有垃圾回收方式都可以使用標(biāo)記復(fù)制進(jìn)行,速度極快
G1 垃圾回收分為以下過程:
G1 的垃圾收集分三類
young gc : eden 區(qū)滿切預(yù)計(jì)回收時(shí)間接近 -XX:MaxGCPauseMills 配置的暫停時(shí)間則進(jìn)行新生代回收,否則嘗試擴(kuò)容 eden 區(qū)
mixed gc : 混合 gc 在收集區(qū)域上類似 CMS 的 full gc ,會(huì)回收 young 和 old 以及 humongous
full gc: 這個(gè)更像是最終解決方案,當(dāng) mixed gc 都無法正常釋放空間時(shí),將進(jìn)入并發(fā)失敗進(jìn)行單線程的 full gc 全程 STW
之前些了篇詳解感興趣可以看看,這里不在贅述 JVM 垃圾收集器 G1 詳解
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:【Java快速?gòu)?fù)習(xí)】垃圾回收算法&垃圾回收器-創(chuàng)新互聯(lián)
鏈接地址:http://chinadenli.net/article8/iidip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、全網(wǎng)營(yíng)銷推廣、網(wǎng)站維護(hù)、動(dòng)態(tài)網(wǎng)站、域名注冊(cè)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容