不能衡量,就不能改進(jìn)勇边,所以是好與是壞犹撒,一切都是從如何評(píng)價(jià)衡量開始的。
停頓時(shí)間和吞吐量便是一切垃圾級(jí)收集器的評(píng)價(jià)準(zhǔn)則粒褒。G1有著更可控的pause time 和 更大的throughput识颊,所以g1在java9 便是默認(rèn)的垃圾收集器,是cms 的替代者奕坟。
所謂的pause time祥款,就是只每次停頓的的時(shí)間長(zhǎng)度,在jvm運(yùn)行時(shí)候月杉,有可能發(fā)生停頓的是刃跛,minor gc是Stop the word,還有cms 老年代的過程中苛萎,init mark 和 remark桨昙,cleanup的時(shí)候,注意pause time就是單次時(shí)長(zhǎng)腌歉。為什么我們要關(guān)注它呢蛙酪?因?yàn)楹芏嘣诰€服務(wù)是必須要是高響應(yīng)的,沒人愿意等太長(zhǎng)時(shí)間翘盖。
而吞吐量是為了在某段時(shí)間內(nèi)最大化利用系統(tǒng)資源桂塞,或者為了完成更多的任務(wù)。
那么G1為什么會(huì)比cms在這兩個(gè)指標(biāo)上都有優(yōu)異的表現(xiàn)呢馍驯?它們的實(shí)現(xiàn)又有什么相似和不同之處呢阁危?這可以從堆內(nèi)存布局開始,因?yàn)槲覀冎览占占氖嵌褍?nèi)存汰瘫。
垃圾分代回收的假說源于大都新生對(duì)象都是朝生暮死狂打,所以g1之前的收集器,新生代都是一塊連續(xù)的物理內(nèi)存空間吟吝,而g1也有新生代菱父,只不過進(jìn)化成邏輯上連續(xù)的,實(shí)際上是有大小相等不連續(xù)的region組成。老年代之前也是連續(xù)的物理空間浙宜,到g1也自然而然也是不連續(xù)的官辽。
那么為什么這么設(shè)計(jì)呢?是為了滿足可控的停頓時(shí)間的要求粟瞬。垃圾收集每次是要針對(duì)每一代進(jìn)行收集同仆,之前內(nèi)存不管怎么分,垃圾收集都是運(yùn)行在粗粒度的一代上面裙品,而g1把粒度降到了region這個(gè)level上俗批,region的選擇可以是那些具有最大回收價(jià)值的上面。
因?yàn)閮?nèi)存布局的進(jìn)化市怎,在回收算法上cms之前的標(biāo)記清除也就不需要了岁忘,標(biāo)記清除造成內(nèi)存碎片,最終可能引發(fā)full gc是非常不可控的区匠。而g1的不管是年輕代或者老年代(mix mode)回收都是copy算法干像,由此帶來(lái)的好處是內(nèi)存整理好的。
以上非常大概的比較了一下cms和g1.