垃圾清除階段
當(dāng)成功區(qū)分出內(nèi)存中存活對象和死亡對象后默怨,GC接下來的任務(wù)就是執(zhí)行垃圾回收瞬雹,釋放掉無用對象所占用的內(nèi)存空間醋粟,以便于能夠有足夠的可用內(nèi)存空間為新對象分配內(nèi)存尝偎。
標(biāo)記-清除 算法(Mark-Sweep)是一種非常基礎(chǔ)和常見的 垃圾收集算法至壤,實(shí)現(xiàn)很簡單
執(zhí)行過程:
當(dāng)堆中有效空間全部耗盡的時(shí)候威始,就會停止整個(gè)程序(stop the world),然后進(jìn)行兩項(xiàng)工作像街,第一項(xiàng)是標(biāo)記黎棠,第二項(xiàng)則是清除
標(biāo)記: Collertor從引用根節(jié)點(diǎn)開始便利,標(biāo)記所有被引用的對象镰绎。一般是在對象的Header中記錄為可達(dá)對象
清除: Collector對堆內(nèi)存從頭到尾進(jìn)行線性的遍歷脓斩,如果發(fā)現(xiàn)某個(gè)對象在其Header中沒有標(biāo)記為可達(dá)對象,則將其回收
缺點(diǎn)
1.效率不算高
2.在進(jìn)行GC的時(shí)候畴栖,需要停止整個(gè)應(yīng)用程序随静,導(dǎo)致用戶體驗(yàn)很差
3.這種方式清理出來的空閑內(nèi)昆是不連續(xù)的,產(chǎn)生內(nèi)存碎片吗讶,需要維護(hù)一個(gè)空閑列表
注意:何為清除燎猛?
這里所謂的清除并不是真的置空,而是把需要清除的對象地址保存在空閑的地址列表里照皆,下次有新對象需要加載時(shí)重绷,判斷垃圾的位置空間是否夠,如果夠膜毁,就覆蓋存放