主要垃圾回收器和垃圾回收算法
垃圾回收算法:
-
標(biāo)記清除算法 mark-sweep 分為標(biāo)記和清除兩個(gè)階段,但是內(nèi)存碎片化嚴(yán)重
-
復(fù)制算法 copying 為了解決內(nèi)存碎片化問題,但是空間利用率降低,主要用于大量對(duì)象存活時(shí)間短的年輕代垃圾回收
-
標(biāo)記壓縮算法 mark-compact compact緊湊使壓實(shí)的意思,即標(biāo)記后不是清除而是將仍存活的對(duì)象移向內(nèi)存的一端,清理掉端界外的垃圾對(duì)象,主要用于老年代的垃圾回收
-
分代收集算法:是現(xiàn)在大多JVM采用的方法,即根據(jù)對(duì)象生存周期的不同把堆分為年輕代和年老代,采用不同的垃圾回收算法
-
分區(qū)收集算法:G1引入的回收算法,基于標(biāo)記壓縮算法,不會(huì)產(chǎn)生內(nèi)存碎片。且避免全區(qū)域垃圾收集,它將整個(gè)堆空間劃分為幾個(gè)獨(dú)立的小區(qū)間,每個(gè)小區(qū)間獨(dú)立使用,獨(dú)立回收,在后臺(tái)維護(hù)一個(gè)優(yōu)先級(jí)列表,每次可以根據(jù)允許的垃圾收集時(shí)間,優(yōu)先收集垃圾最多的區(qū)域,而不是回收整個(gè)堆,精確控制GC停頓時(shí)間。
掃描堆中哪些對(duì)象是垃圾耗時(shí)比較長,所以誕生了并發(fā)標(biāo)記,即三色標(biāo)記,使用黑白灰,一輪輪去掃描,但是并發(fā)標(biāo)記很容易造成錯(cuò)標(biāo)和漏標(biāo)(浮動(dòng)垃圾),怎么解決錯(cuò)標(biāo)的問題?
CMS采用增量更新的方法把黑的標(biāo)成灰的,但是并發(fā)時(shí)多線程可能又給變成黑色。
G1采用SATB,把還沒掃描到的對(duì)象,做一個(gè)快照,把引用引到堆棧,rememberSet中,保證了能再次掃描到這個(gè)垃圾region
但是G1也有問題,STW也比較長,幾百毫秒 -
顏色指針?biāo)惴?/strong>:ZGC采用的算法,利用指針來記錄對(duì)象的狀態(tài),這樣對(duì)象的銷毀只需要改變指針內(nèi)容即可,大大縮短了掃描時(shí)間,無論內(nèi)存大小GC停頓都可以穩(wěn)定在只有10毫秒左右,停頓時(shí)間和內(nèi)存增長沒有關(guān)系!!所以ZGC支持2的42次方=4T,最大16T級(jí)別的內(nèi)存
不分代,但是將來可能分冷熱對(duì)象
讀屏障
顏色指針.全新的算法,和三色標(biāo)記完全不同.原來的GC信息記錄在對(duì)象頭,而ZGC記錄在對(duì)象的指針上,不用記錄在對(duì)象上了.所以指針記錄對(duì)象無用后,這個(gè)對(duì)象所處的內(nèi)存就可以立即使用了!
在64位指針里分出4位來記錄對(duì)象的狀態(tài)m0 ,m1,remapped, finalizable
內(nèi)存回收完可以立即使用
NUMA aware。之前CPU多了后,會(huì)再訪問內(nèi)存時(shí)產(chǎn)生競(jìng)爭(zhēng),浪費(fèi)時(shí)間。所以NUMA引入,為每個(gè)CPU優(yōu)先分配近的內(nèi)存
常見垃圾收集器
CMS垃圾回收器以最短回收停頓時(shí)間為目的。CMS 是 Concurrent Mark Sweep 的縮寫,意為并發(fā)標(biāo)記清除,使用的是標(biāo)記-清除算法,同時(shí)它又是一個(gè)使用多線程并發(fā)回收的垃圾收集器。一般比較注重服務(wù)端性能的時(shí)候使用它,它的回收過程可以分成四個(gè)步驟:1. 初始標(biāo)記、2. 并發(fā)標(biāo)記、3. 重新標(biāo)記、4. 并發(fā)清除。
初始標(biāo)記和重新標(biāo)記這兩個(gè)步驟仍然需要“Stop The World”。初始標(biāo)記僅僅只是標(biāo)記一下GC Roots 能直接關(guān)聯(lián)到的對(duì)象,速度很快,并發(fā)標(biāo)記階段就是進(jìn)行GC RootsTracing的過程,而重新標(biāo)記階段就是為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)行而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間一般會(huì)比初始標(biāo)記階段稍微長一些,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短。由于整個(gè)過程中耗時(shí)最長的并發(fā)標(biāo)記和并發(fā)清除過程,所以從總體上說,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)執(zhí)行的。
UseParallelGC:可以有效的利用多CPU,最大化的提高程序吞吐量,但它不能與CMS收集器配合工作。
UseParNewGC :ParNew收集器是Serial收集器的多線程版本,在收集過程中,會(huì)stop-the-world。但它卻是許多運(yùn)行在Server模式下的虛擬機(jī)中首選的新生代收集器,很重要的原因是目前只有它能與CMS收集器配合工作。
常用的三個(gè)組合如下:
| JDK1.8默認(rèn)的 | Parallel scavenge | Parallel Old |
| -XX:+UseParNewGC -XX:+UseConcMarkSweepGC | ParNewGC | CMS |
| -XX:UseG1GC | G1 |
UseParNewGC 或者G1是需要手動(dòng)開啟的,目前常用的就是下面兩種
總結(jié)
以上是生活随笔為你收集整理的主要垃圾回收器和垃圾回收算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis 小功能大用处
- 下一篇: OAuth2.0的四种授权方式