內(nèi)存
JS 數(shù)據(jù)的存儲(chǔ)地址分為棧內(nèi)存
和堆內(nèi)存
瀑凝。
棧內(nèi)存
存放基礎(chǔ)數(shù)據(jù)類(lèi)型(如: String Number Boolean Symbol)以及函數(shù)和對(duì)象的引用地址
堆內(nèi)存
存放對(duì)象的具體值
在 JS 存放數(shù)據(jù)的內(nèi)存中又分為高位
和低位
,其中高位存放棧數(shù)據(jù)臭杰,低位存放堆數(shù)據(jù)粤咪,堆數(shù)據(jù)不可控?cái)?shù)據(jù)的大小。
垃圾回收(Garbage Collection)
堆數(shù)據(jù)的垃圾回收
在堆數(shù)據(jù)中渴杆,又分為新生代數(shù)據(jù)
和老生代數(shù)據(jù)
寥枝,新生代數(shù)據(jù)是指新創(chuàng)建的數(shù)據(jù)宪塔,老生代是指在新生代數(shù)據(jù)中被標(biāo)記存活下來(lái)的數(shù)據(jù),也就是上一次掃描中沒(méi)有被清理掉的數(shù)據(jù)囊拜,老生代不容易被回收某筐。
對(duì)于新生代數(shù)據(jù)使用 scavenge
算法。具體是將新生代數(shù)據(jù)的內(nèi)存一分為二冠跷,分別為 from
和 to
南誊。
第一次創(chuàng)建的堆數(shù)據(jù)將進(jìn)入 from
中。from
中的數(shù)據(jù)如果滿(mǎn)了蜜托,將進(jìn)行一次 GC
抄囚。也就是對(duì) from
中的堆數(shù)據(jù)遍歷一次進(jìn)行標(biāo)記清除
。標(biāo)記的數(shù)據(jù)將全部拷貝到 to
中盗冷,然后清除掉 from
中的數(shù)據(jù)怠苔。然后再次新創(chuàng)建的數(shù)據(jù)將放到 to
中同廉。如果 to
的內(nèi)存滿(mǎn)了仪糖,又會(huì)進(jìn)行一次 GC
。上一次 GC
中被標(biāo)記的數(shù)據(jù)將進(jìn)入到老生代內(nèi)存中迫肖。也就是說(shuō)新生代的數(shù)據(jù)有一部分晉升了锅劝。
對(duì)于老生代數(shù)據(jù)的垃圾回收是標(biāo)記清楚
+標(biāo)記整理
。
老生代內(nèi)存滿(mǎn)了會(huì)觸發(fā)一次 GC
蟆湖,遍歷一遍老生代數(shù)據(jù)故爵,刪除沒(méi)有被使用的數(shù)據(jù)。剩余的數(shù)據(jù)段會(huì)存在不連續(xù)隅津,還有內(nèi)存诬垂,分配不了大數(shù)據(jù)的問(wèn)題。所以會(huì)進(jìn)行標(biāo)記整理
伦仍,也就是對(duì)老生代數(shù)據(jù)進(jìn)行移動(dòng)整合內(nèi)存段结窘,但是這樣會(huì)造成瀏覽器卡頓。所以會(huì)進(jìn)行增量標(biāo)記增量整理
充蓝,每次只移動(dòng)一段隧枫。