欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談JavaScript的自動垃圾收集機(jī)制

 更新時(shí)間:2016年12月15日 16:40:31   作者:林泠  
本文主要對JavaScript的自動垃圾收集機(jī)制進(jìn)行簡要分析,并介紹了垃圾收集的方式:標(biāo)記清除(mark-and-sweep)和引用計(jì)數(shù)(reference counting),需要的朋友一起來看下吧

執(zhí)行環(huán)境會負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存,編寫JavaScript程序時(shí),所需內(nèi)存的分配以及無用內(nèi)存的回收完全實(shí)現(xiàn)自動管理。

原理:

找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。為此,垃圾收集器會按照固定的時(shí)間間隔(或代碼執(zhí)行中預(yù)定的收集時(shí)間)周期性地執(zhí)行這一操作。

垃圾收集的方式:

1.標(biāo)記清除(mark-and-sweep)

  最常用的垃圾收集方式。當(dāng)變量進(jìn)入環(huán)境時(shí),就將變量標(biāo)記為“進(jìn)入環(huán)境”。從邏輯上講,永遠(yuǎn)不能釋放進(jìn)入環(huán)境的變量所占用的內(nèi)存,因?yàn)橹灰獔?zhí)行流進(jìn)入相應(yīng)的環(huán)境,就可能會用到它們。當(dāng)變量離開環(huán)境時(shí),則將其標(biāo)記為“離開環(huán)境”。

  立即收集器在運(yùn)行時(shí)會給存儲在內(nèi)存中的所有變量都加上標(biāo)記,然后它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。剩下的在被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量。最后,垃圾收集器完成內(nèi)存清除,銷毀那些帶有標(biāo)記的值并收回它們所占用的內(nèi)存空間。

2.引用計(jì)數(shù)(reference counting)

  跟蹤記錄每個(gè)值被引用的次數(shù),當(dāng)這個(gè)值的引用次數(shù)為0時(shí),說明沒有辦法再訪問這個(gè)值了,因而就可以將其占用的內(nèi)存空間回收回來。當(dāng)垃圾收集器下次再運(yùn)行時(shí),會釋放那些引用次數(shù)為零的值所占用的內(nèi)存。

(1)應(yīng)用機(jī)制存在一個(gè)問題:循環(huán)引用。

  循環(huán)引用是指對象A中包含一個(gè)指向?qū)ο驜的指針,而對象B中也包含一個(gè)指向?qū)ο驛的引用。(這樣它們的引用可能永遠(yuǎn)不為0,如果函數(shù)被重復(fù)多次調(diào)用,就會導(dǎo)致大量的內(nèi)存得不到回收。)

(2)IE中的BOM和DOM中的對象使用C++以COM(component Object Model,組件對象模型)對象的形式實(shí)現(xiàn),而COM對象的垃圾收集機(jī)制采用的是引用計(jì)數(shù)策略。

以下是COM對象導(dǎo)致的循環(huán)引用的問題:

eg:

var element=document.getElementById("some_element");
 var myObject=new Object();
 myObject.element=element;
 element.someObject=myObject;

上面的例子在一個(gè)DOM元素(element)和一個(gè)原生JavaScript對象(myObject)之間創(chuàng)建了循環(huán)引用。由于存在這個(gè)循環(huán)引用,即使將例子中的DOM從頁面移除,它也永遠(yuǎn)不會被回收。

可以使用以下代碼手工斷開原生JavaScript和DOM元素之間的鏈接:

myObject.element=null;
element.someObject=null;

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • 詳解javascript中的Strict模式

    詳解javascript中的Strict模式

    我們都知道javascript是一個(gè)弱類型語言,在ES5之前,javascript的程序編寫具有很強(qiáng)的隨意性,我可以稱之為懶散模式(sloppy mode)。比如可以使用未定義的變量,可以給對象中的任意屬性賦值并不會拋出異常等等。本文將詳細(xì)介紹javascript中的Strict模式。
    2021-06-06
  • JavaScript獲取對象鍵名的五種方法

    JavaScript獲取對象鍵名的五種方法

    在 JavaScript 中,操作對象時(shí)獲取鍵名是高頻需求,不同場景下,我們需要篩選「自身/繼承屬性」「可枚舉/不可枚舉鍵」「字符串/Symbol 鍵」,本文將全面梳理 5 種核心方法的差異與適用場景,助你精準(zhǔn)選擇,需要的朋友可以參考下
    2025-04-04
  • JS數(shù)組方法shift()、unshift()用法實(shí)例分析

    JS數(shù)組方法shift()、unshift()用法實(shí)例分析

    這篇文章主要介紹了JS數(shù)組方法shift()、unshift()用法,結(jié)合實(shí)例形式分析了JavaScript數(shù)組shift()與unshift()方法功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • 使用classList來實(shí)現(xiàn)兩個(gè)按鈕樣式的切換方法

    使用classList來實(shí)現(xiàn)兩個(gè)按鈕樣式的切換方法

    下面小編就為大家分享一篇使用classList來實(shí)現(xiàn)兩個(gè)按鈕樣式的切換方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 使用Microsoft Ajax Minifier減小JavaScript文件大小的方法

    使用Microsoft Ajax Minifier減小JavaScript文件大小的方法

    大家用來減小JavaScript文件下載大小的常見的方式有2種: 壓縮(compression)和縮?。╩inification)。
    2010-04-04
  • JavaScript實(shí)現(xiàn)扯網(wǎng)動畫效果的示例代碼

    JavaScript實(shí)現(xiàn)扯網(wǎng)動畫效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript語言實(shí)現(xiàn)扯網(wǎng)動畫效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)JS有一定的幫助,需要的可以參考一下
    2022-06-06
  • JS實(shí)現(xiàn)簡單打字測試

    JS實(shí)現(xiàn)簡單打字測試

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)簡單打字測試,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • JavaScript私有變量實(shí)例詳解

    JavaScript私有變量實(shí)例詳解

    這篇文章主要介紹了JavaScript私有變量,結(jié)合實(shí)例形式分析了javascript私有變量的常見定義及訪問方法,需要的朋友可以參考下
    2019-01-01
  • 詳解tween.js 中文使用指南

    詳解tween.js 中文使用指南

    本篇文章主要介紹了詳解tween.js 中文使用指南,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Web打印解決方案之普通報(bào)表打印功能

    Web打印解決方案之普通報(bào)表打印功能

    這篇文章主要介紹了Web打印解決方案之普通報(bào)表打印功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08

最新評論