介紹
V8的垃圾回收策略主要是基于分代垃圾回收機(jī)制壕探。在垃圾回收演變的過(guò)程中,人們發(fā)現(xiàn)沒(méi)有哪一種辦法能夠滿足所有應(yīng)用場(chǎng)景郊丛。V8內(nèi)存分為新生代和老生代李请,新生代就是存活時(shí)間較短對(duì)象,老生代就是存活時(shí)間較長(zhǎng)對(duì)象厉熟。
新生代算法(scavenge)
在分代的基礎(chǔ)上导盅,新生代用的是scavenge算法,再具體實(shí)現(xiàn)是用cheney算法揍瑟,它把內(nèi)存空間一分為二白翻,每一個(gè)叫做semispace,這兩個(gè)semispace一個(gè)處于使用月培,一個(gè)處于閑置嘁字,處于使用的叫做From,處于閑置的叫做To杉畜,賦值時(shí)先分配到From纪蜒,當(dāng)開(kāi)始進(jìn)行垃圾回收時(shí),還在被使用的變量會(huì)被復(fù)制到To此叠,否則會(huì)被直接釋放掉纯续,然后From和To互換位置,在開(kāi)始下一次垃圾回收機(jī)制時(shí)灭袁,如果還被使用則晉升為老生代猬错,或者占用空間大于25%。
它的缺點(diǎn)是只能使用堆內(nèi)存的一半茸歧,這是一個(gè)典型的空間換時(shí)間算法倦炒,但新生代聲明周期較短,恰恰就適合這個(gè)算法软瞎。
老生代算法(mark-sweep & mark-compact)
老生代是用了mark-sweep 和 mark-compact算法逢唤,再用scavenge算法不合適。一是太多對(duì)象需要被賦值涤浇,而且還是沒(méi)有解決空間問(wèn)題鳖藕。mark-sweep標(biāo)記清除法,是將死亡的對(duì)象進(jìn)行標(biāo)記只锭,然后去清除著恩,但是這樣會(huì)產(chǎn)生不連續(xù)的內(nèi)存空間。為了解決這一問(wèn)題,從mark-sweep演變過(guò)來(lái)一個(gè)mark-compact算法喉誊,它是將存活的對(duì)象移動(dòng)到一邊邀摆,然后清除邊界外的內(nèi)存,當(dāng)CPU空間不足時(shí)效率很高裹驰。
V8后續(xù)還引入了延遲處理隧熙,增量處理,并計(jì)劃引入標(biāo)記處理幻林。