垃圾收集

我們都知道JavaScript具有自動垃圾收集機制,這也就是說抗蠢,執(zhí)行環(huán)境會管理代碼執(zhí)行過程中使用的內(nèi)存举哟。

這種垃圾收集機制的原理很簡單:找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存迅矛。

垃圾收集器必須跟蹤那個變量有用哪個變量沒用妨猩,對于不再有用的變量打上標記,以備將來收回其占用的內(nèi)存秽褒。用于標識無用的策略可能會因?qū)崿F(xiàn)而異册赛,但具體到瀏覽器中的實現(xiàn),則通常有兩個策略震嫉。

一.標記清除

1.標記清除是JavaScript中最常用的垃圾收集方式森瘪。
2.當變量進入環(huán)境時,就將這個變量標記為“進入環(huán)境”票堵,當變量離開環(huán)境時扼睬,則將其標記為“離開環(huán)境”。
3.可以使用任何方式來標記變量悴势。
4.垃圾收集器在運行時候會給存儲在內(nèi)存中的所有變量都加上標記窗宇。然后,它會去掉環(huán)境中的變量以及被環(huán)境中引用的變量的標記特纤。而在此之后再被加上標記的變量將被視為準備刪除的變量军俊,因為環(huán)境中的變量已經(jīng)無法訪問到這些變量了。最后捧存,垃圾收集器完成內(nèi)存清除工作粪躬,銷毀那些帶標記的值并收回它們所占用的內(nèi)存空間 。

二.引用計數(shù)

另一種不太常用的垃圾收集策略叫做引用計數(shù)昔穴。
引用計數(shù)其實就是跟蹤記錄每個值被引用的次數(shù)镰官。
1.聲明一個變量并將引用類型值賦給改變量,這個值的引用次數(shù)為1吗货;
2.如果同一個值又被賦給另一個變量泳唠,則改引用次數(shù)加1;
3.如果包含對這個值引用的變量又取另一個值宙搬,該引用次數(shù)減1笨腥;
4.當這個值得 引用次數(shù)為0時拓哺,說明無法訪問這個值,將其占用的內(nèi)存空間收回脖母。
5.當垃圾收收集器 下次運行時士鸥,釋放引用次數(shù)為0的值所占用的內(nèi)存。

下面我們來看一個循環(huán)引用的栗子

function problem(){
    var  objectA = new Object();
    var  objectB = new Object();
                
    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
}

在這個例子 中镶奉,objectA和objectB通過各自屬性相互引用,也就是說崭放,這兩個對象的引用次數(shù)都是2哨苛。

當采用標記清除策略時,由于函數(shù)執(zhí)行完后币砂,兩個對象都離開了作用域建峭,這種相互引用不存在問題。

當采用引用計數(shù)策略時决摧,函數(shù)執(zhí)行完畢后亿蒸,但objectA和objectB依然存在,因為它們的引用次數(shù)永遠不會為0掌桩,假如這個函數(shù)被多次調(diào)用边锁,就會導致大量內(nèi)存得不到回收。

所以說波岛,引用計數(shù)策略會導致很多麻煩茅坛。

性能問題

垃圾收集器是周期性運行的,而且如果分配的內(nèi)存數(shù)量很客觀则拷,那么回收工作量也是相當大的贡蓖。
在這種情況下,確定垃圾收集的時間間隔是一個非常重要的問題煌茬。

JavaScript引擎的垃圾收集例程改變了工作方式:觸發(fā)垃圾收集的變量分配斥铺,字面量和數(shù)組元素的臨界值被調(diào)整為動態(tài)修正。

管理內(nèi)存

JavaScript在進行內(nèi)存管理及垃圾收集時面臨一個問題:分配給Web瀏覽器的可用內(nèi)存數(shù)量通常比分配給桌面應用程序的少坛善。
這樣做的目的是:防止運行JavaScript的網(wǎng)頁耗盡全部系統(tǒng)內(nèi)存而導致系統(tǒng)崩潰晾蜘。
解除引用:為了在執(zhí)行代碼時只保存必要的數(shù)據(jù),一旦數(shù)據(jù)不再有用眠屎,最好通過將其值設置為null來釋放其引用笙纤。
這一做法適用于大多數(shù)全局變量和全局對象的屬性。
局部變量會在它們離開執(zhí)行環(huán)境時自動被解除引用组力。

我們來看看下面的栗子:

function createPerson(name){
    var localPerson = new Object();
    localPerson.name = name;
    return localPerson;
}
var globalPerson = createPerson("Jimmy");
//手工解除globalPerson的引用
globalPerson = null;

在這個例子中l(wèi)acalPerson是一個局部變量省容,它在createPerson()函數(shù)執(zhí)行完畢后就離開了執(zhí)行環(huán)境,不需要我們?nèi)樗獬茫琯lobalPerson是一個全部變量燎字,我們通過給它設null來手動解除腥椒。

解除一個值的引用并不意味著自動收回該值所占用的內(nèi)存阿宅,解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,方便垃圾收集器器下次運行時將其收回笼蛛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洒放,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滨砍,更是在濱河造成了極大的恐慌往湿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惋戏,死亡現(xiàn)場離奇詭異领追,居然都是意外死亡,警方通過查閱死者的電腦和手機响逢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門绒窑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舔亭,你說我怎么就攤上這事些膨。” “怎么了钦铺?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵订雾,是天一觀的道長。 經(jīng)常有香客問我矛洞,道長葬燎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任缚甩,我火速辦了婚禮谱净,結(jié)果婚禮上斋扰,老公的妹妹穿的比我還像新娘观蜗。我一直安慰自己,他們只是感情好与倡,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布郊丛。 她就那樣靜靜地躺著李请,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厉熟。 梳的紋絲不亂的頭發(fā)上导盅,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音揍瑟,去河邊找鬼白翻。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的滤馍。 我是一名探鬼主播岛琼,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巢株!你這毒婦竟也來了槐瑞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阁苞,失蹤者是張志新(化名)和其女友劉穎困檩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體那槽,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡悼沿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倦炒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片显沈。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡软瞎,死狀恐怖逢唤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涤浇,我是刑警寧澤鳖藕,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站只锭,受9級特大地震影響著恩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜻展,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一喉誊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵顾,春花似錦伍茄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汉额,卻和暖如春曹仗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蠕搜。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工怎茫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妓灌。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓遭居,卻偏偏與公主長得像啼器,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俱萍,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容