總結(jié):
javascript使用的是標(biāo)記清除的方式:
這是JavaScript最常見的垃圾回收方式,當(dāng)變量進入執(zhí)行環(huán)境的時候,比如函數(shù)中聲明一個變量,垃圾回收器將其標(biāo)記為“進入環(huán)境”,當(dāng)變量離開環(huán)境的時候(函數(shù)執(zhí)行結(jié)束)將其標(biāo)記為“離開環(huán)境”。至于怎么標(biāo)記有很多種方式,比如特殊位的反轉(zhuǎn)、維護一個列表等,這些并不重要,重要的是使用什么策略,原則上講不能夠釋放進入環(huán)境的變量所占的內(nèi)存,它們隨時可能會被調(diào)用的到。
垃圾回收器會在運行的時候給存儲在內(nèi)存中的所有變量加上標(biāo)記,然后去掉環(huán)境中的變量以及被環(huán)境中變量所引用的變量(閉包),在這些完成之后仍存在標(biāo)記的就是要刪除的變量了,因為環(huán)境中的變量已經(jīng)無法訪問到這些變量了,然后垃圾回收器相會這些帶有標(biāo)記的變量機器所占空間。
大部分瀏覽器都是使用這種方式進行垃圾回收,區(qū)別在于如何標(biāo)記及垃圾回收間隔而已,只有低版本IE,不出所料,又是IE。。。
引用計數(shù):
在低版本IE中經(jīng)常會出現(xiàn)內(nèi)存泄露,很多時候就是因為其采用引用計數(shù)方式進行垃圾回收。引用計數(shù)的策略是跟蹤記錄每個值被使用的次數(shù),當(dāng)聲明了一個變量并將一個引用類型賦值給該變量的時候這個值的引用次數(shù)就加1,如果該變量的值變成了另外一個,則這個值得引用次數(shù)減1,當(dāng)這個值的引用次數(shù)變?yōu)?的時候,說明沒有變量在使用,這個值沒法被訪問了,因此可以將其占用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數(shù)為0的值占用的空間。
看起來也不錯的方式,為什么很少有瀏覽器采用,還會帶來內(nèi)存泄露問題呢?主要是因為這種方式?jīng)]辦法解決循環(huán)引用問題。