摘要:標(biāo)記清除中最常用的垃圾收集方式是標(biāo)記清除。最后,垃圾收集器完成內(nèi)存清除工作,銷(xiāo)毀那些帶標(biāo)記的值并回收他們所占用的內(nèi)存空間。到年為止,和的實(shí)現(xiàn)使用的都是標(biāo)記清除式的垃圾收集策略或類(lèi)似的策略,只不過(guò)垃圾收集的時(shí)間間隔互有不同。
標(biāo)記清除
Javascript中最常用的垃圾收集方式是標(biāo)記清除(mark-and-sweep)。當(dāng)變量進(jìn)入環(huán)境(例如,在函數(shù)中聲明一個(gè)變量)時(shí),就將這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”,永遠(yuǎn)不能釋放進(jìn)入環(huán)境的變量所占用的內(nèi)存,因?yàn)橹灰獔?zhí)行流進(jìn)入相應(yīng)的環(huán)境,就可能會(huì)用到他們。而當(dāng)變量離開(kāi)環(huán)境時(shí),則將其標(biāo)記為“離開(kāi)環(huán)境”。
可以使用任何方式來(lái)標(biāo)記變量。比如,可以通過(guò)翻轉(zhuǎn)某個(gè)特殊的位來(lái)記錄一個(gè)變量何時(shí)進(jìn)入環(huán)境,或者使用一個(gè)“進(jìn)入環(huán)境的”變量列表及一個(gè)“離開(kāi)環(huán)境的”變量列表來(lái)跟蹤哪個(gè)變量發(fā)生了變化。說(shuō)到底,如何標(biāo)記變量其實(shí)并不重要,關(guān)鍵在于采取什么策略。
垃圾收集器在運(yùn)行的時(shí)候會(huì)給存儲(chǔ)在內(nèi)存中的所有變量都加上標(biāo)記(當(dāng)然,可以使用任何標(biāo)記方式)。然后,他會(huì)在去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。而在此之后仍帶有標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無(wú)法訪(fǎng)問(wèn)到這些變量了。最后,垃圾收集器完成內(nèi)存清除工作,銷(xiāo)毀那些帶標(biāo)記的值并回收他們所占用的內(nèi)存空間。
到2008年為止,IE、Firefox、Opera、Chrome和Safari的JavaScript實(shí)現(xiàn)使用的都是標(biāo)記清除式的垃圾收集策略(或類(lèi)似的策略),只不過(guò)垃圾收集的時(shí)間間隔互有不同。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85326.html
摘要:待分析下面我們來(lái)分析一下函數(shù)中局部變量的正常聲明周期。局部變量只在函數(shù)執(zhí)行的過(guò)程中存在。此時(shí),局部變量就沒(méi)有存在的必要了,因此可以釋放他們的內(nèi)存以供將來(lái)使用。 以下總結(jié)內(nèi)容來(lái)自《JavaScript高級(jí)程序》(第三版) 頁(yè)碼:78 JavaScript具有自動(dòng)垃圾收集機(jī)制,也就是說(shuō),執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存。而在C和C++之類(lèi)的語(yǔ)言中,開(kāi)發(fā)人員的一項(xiàng)基本任務(wù)就...
摘要:可是,引用計(jì)數(shù)導(dǎo)致的麻煩并未就此終結(jié)。其中,變量有一個(gè)名為的屬性指向?qū)ο蠖兞恳灿幸粋€(gè)屬性名為回指。當(dāng)垃圾收集器下次運(yùn)行時(shí),就會(huì)刪除這些值并回收它們所占用的內(nèi)存。 引用計(jì)數(shù) 另一種不太常見(jiàn)的垃圾收集策略叫做引用計(jì)數(shù)(reference counting)。引用計(jì)數(shù)的含義是跟蹤記錄每個(gè)值被引用的次數(shù)。當(dāng)聲明了一個(gè)變量并將一個(gè)應(yīng)用類(lèi)型值賦給該變量時(shí),則這個(gè)值的應(yīng)用次數(shù)就是1。如果同...
摘要:作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪(fǎng)問(wèn)的所有變量和函數(shù)的有序訪(fǎng)問(wèn)。作用域鏈的前端,始終都是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象。對(duì)語(yǔ)句來(lái)說(shuō),會(huì)將指定的對(duì)象添加到作用域鏈中。 前言 ps: 2018/05/13 經(jīng)指正之后發(fā)現(xiàn)惰性加載函數(shù)細(xì)節(jié)有問(wèn)題,已改正在這里也補(bǔ)充一下,這些都是根據(jù)自己理解寫(xiě)的例子,不一定說(shuō)的都對(duì),有些只能查看不能運(yùn)行的要謹(jǐn)慎,因?yàn)槲铱赡苤皇菍⒎椒ㄋ悸穼?xiě)出來(lái),沒(méi)有實(shí)際跑...
摘要:本系列的第一篇文章簡(jiǎn)單介紹了引擎運(yùn)行時(shí)間和堆棧的調(diào)用。編譯器將插入與操作系統(tǒng)交互的代碼,并申請(qǐng)存儲(chǔ)變量所需的堆棧字節(jié)數(shù)。當(dāng)函數(shù)調(diào)用其他函數(shù)時(shí),每個(gè)函數(shù)在調(diào)用堆棧時(shí)獲得自己的塊。因此,它不能為堆棧上的變量分配空間。 本系列的第一篇文章簡(jiǎn)單介紹了引擎、運(yùn)行時(shí)間和堆棧的調(diào)用。第二篇文章研究了谷歌V8 JavaScript引擎的內(nèi)部機(jī)制,并介紹了一些編寫(xiě)JavaScript代碼的技巧。 在這第...
摘要:引擎對(duì)堆內(nèi)存中的對(duì)象進(jìn)行分代管理新生代存活周期較短的對(duì)象,如臨時(shí)變量字符串等。內(nèi)存泄漏對(duì)于持續(xù)運(yùn)行的服務(wù)進(jìn)程,必須及時(shí)釋放不再用到的內(nèi)存。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第4天。 本計(jì)劃一共28期,每期重點(diǎn)攻克一個(gè)面試重難點(diǎn),如果你還不了解本進(jìn)階計(jì)劃...
閱讀 2032·2023-04-25 22:50
閱讀 2845·2021-09-29 09:35
閱讀 3399·2021-07-29 10:20
閱讀 3169·2019-08-29 13:57
閱讀 3368·2019-08-29 13:50
閱讀 3043·2019-08-26 12:10
閱讀 3538·2019-08-23 18:41
閱讀 2646·2019-08-23 18:01