最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript內(nèi)存管理介紹

 更新時間:2015年03月13日 11:13:07   投稿:junjie  
這篇文章主要介紹了JavaScript內(nèi)存管理介紹,本文講解了內(nèi)存生命周期、JavaScript的內(nèi)存分配、通過函數(shù)調(diào)用的內(nèi)存分配、當(dāng)內(nèi)存不再需要使用時釋放等內(nèi)容,需要的朋友可以參考下

簡介

低級語言,比如C,有低級的內(nèi)存管理基元,想malloc(),free()。另一方面,JavaScript的內(nèi)存基元在變量(對象,字符串等等)創(chuàng)建時分配,然后在他們不再被使用時“自動”釋放。后者被稱為垃圾回收。這個“自動”是混淆并給JavaScript(和其他高級語言)開發(fā)者一個錯覺:他們可以不用考慮內(nèi)存管理。

內(nèi)存生命周期

不管什么程序語言,內(nèi)存生命周期基本一致:

1.分配你所需要的內(nèi)存
2.使用它(讀、寫)
3.當(dāng)它不被使用時釋放   ps:和“把大象裝冰箱“一個意思

第一二部分過程在所有語言中都很清晰。最后一步在低級語言中很清晰,但是在像JavaScript等高級語言中,最后一步不清晰。

JavaScript的內(nèi)存分配

變量初始化

為了不讓程序員為分配費(fèi)心,JavaScript在定義變量時完成內(nèi)存分配。

復(fù)制代碼 代碼如下:

var n = 123; // 給數(shù)值變量分配內(nèi)存
var s = "azerty"; // 給字符型

var o = {
  a: 1,
  b: null
}; // 為對象及其包含變量分配內(nèi)存

var a = [1, null, "abra"]; // 為數(shù)組及其包含變量分配內(nèi)存(就像對象)
function f(a){
  return a + 2;
} // 為函數(shù)(可調(diào)用的對象)分配內(nèi)存

// 函數(shù)表達(dá)式也能分配一個對象
someElement.addEventListener('click', function(){
  someElement.style.backgroundColor = 'blue';
}, false);

通過函數(shù)調(diào)用的內(nèi)存分配

有些函數(shù)調(diào)用結(jié)果是分配對象內(nèi)存:

復(fù)制代碼 代碼如下:

var d = new Date();
var e = document.createElement('div'); //分配一個DOM元素

有些方法分配新變量或者新對象:

復(fù)制代碼 代碼如下:

var s = "azerty";
var s2 = s.substr(0, 3); // s2 is a new string
//因?yàn)閟tring是不變量,JavaScript可能沒有分配內(nèi)存,但只是存儲了0-3的范圍。

var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2); // 新數(shù)組中有連接數(shù)組a和數(shù)組a2中的四個元素。

值的使用

使用值的過程實(shí)際上是對分配內(nèi)存進(jìn)行讀取與寫入的操作,這意味著可以寫入一個變量或者一個對象的屬性值,甚至傳遞函數(shù)的參數(shù)。

當(dāng)內(nèi)存不再需要使用時釋放

大多數(shù)內(nèi)存管理的問題都在這個階段。在這里最艱難的任務(wù)是找到“所分配的內(nèi)存確實(shí)已經(jīng)不再需要了”。它往往要求開發(fā)人員來確定在程序中哪一塊內(nèi)存不再需要并且釋放它。

高級語言解釋器嵌入了“垃圾回收器”,主要工作是跟蹤內(nèi)存的分配和使用,以便當(dāng)分配的內(nèi)存不再使用時,自動釋放它。這個過程是一個近似的,因?yàn)橐滥硥K內(nèi)存是否需要是 無法判定的 (無法被某種算法所解決).

垃圾回收

如上文所述自動尋找是否一些內(nèi)存“不再需要”的問題是無法判定的。因此,垃圾回收實(shí)現(xiàn)只能有限制的解決一般問題。本節(jié)將解釋必要的概念,了解主要的垃圾回收算法和它們的局限性。

引用

垃圾回收算法主要依賴于引用的概念。在內(nèi)存管理的環(huán)境中,一個對象如果有訪問另一個對象的權(quán)限(隱式或者顯式),叫做一個對象引用另一個對象。例如,一個Javascript對象具有對它 原型 的引用(隱式引用)和對它屬性的引用(顯式引用)。

在這里,“對象”的概念不僅特制Javascript對象,還包括函數(shù)作用域(或者全局詞法作用域)。

引用計數(shù)垃圾收集

這是最簡單的垃圾收集算法。此算法把“對象是否不再需要”簡化定義為“對象有沒有其他對象引用到它”。如果沒有引用指向該對象(零引用),對象將被垃圾回收機(jī)制回收。

例如

復(fù)制代碼 代碼如下:

var o = {
  a: {
    b:2
  }
};
// 兩個對象被創(chuàng)建,一個做為另一個的屬性被引用,另一個被分配給變量o
// 很顯然,沒有一個可以被垃圾收集

var o2 = o; // o2變量是第二個對“這個對象”的引用
o = 1; // 現(xiàn)在,“這個對象”的原始引用o被o2替換了

var oa = o2.a; // 引用“這個對象”的a屬性
// 現(xiàn)在,“這個對象”有兩個引用了,一個是o2,一個是oa

o2 = "yo"; // 最初的對象現(xiàn)在已經(jīng)是零引用了
// 他可以被垃圾回收了
// 然而它的屬性a的對象還在被oa引用,所以還不能回收

oa = null; // a屬性的那個對象現(xiàn)在也是零引用了
// 它可以被垃圾回收了

限制:循環(huán)引用

這個簡單的算法有一個限制,就是如果一個對象引用另一個(形成了循環(huán)引用),他們可能“不再需要”了,但是他們不會被回收。

復(fù)制代碼 代碼如下:

function f(){
  var o = {};
  var o2 = {};
  o.a = o2; // o 引用 o2
  o2.a = o; // o2 引用 o

  return "azerty";
}

f();
// 兩個對象被創(chuàng)建,并互相引用,形成了一個循環(huán)
// 他們被調(diào)用之后不會離開函數(shù)作用域
// 所以他們已經(jīng)沒有用了,可以被回收了
// 然而,引用計數(shù)算法考慮到他們互相都有至少一次引用,所以他們不會被回收

實(shí)際當(dāng)中的例子

IE 6, 7 對DOM對象進(jìn)行引用計數(shù)回收。對他們來說,一個常見問題就是內(nèi)存泄露:

復(fù)制代碼 代碼如下:

var div = document.createElement("div");
div.onclick = function(){
  doSomething();
};
// div有了一個引用指向事件處理屬性onclick
// 事件處理也有一個對div的引用可以在函數(shù)作用域中被訪問到
// 這個循環(huán)引用會導(dǎo)致兩個對象都不會被垃圾回收

標(biāo)記-清除算法

這個算法把“對象是否不再需要”簡化定義為“對象是否可以獲得”。

這個算法假定設(shè)置一個叫做根的對象(在Javascript里,根是全局對象)。定期的,垃圾回收器將從根開始,找所有從根開始引用的對象,然后找這些對象引用的對象……從根開始,垃圾回收器將找到所有可以獲得的對象和所有不能獲得的對象。

這個算法比前一個要好,因?yàn)椤坝辛阋玫膶ο蟆笨偸遣豢色@得的,但是相反卻不一定,參考“循環(huán)引用”。

從2012年起,所有現(xiàn)代瀏覽器都使用了標(biāo)記-清除垃圾回收算法。所有對JavaScript垃圾回收算法的改進(jìn)都是基于標(biāo)記-清除算法的改進(jìn),并沒有改進(jìn)標(biāo)記-清除算法本身和它對“對象是否不再需要”的簡化定義。

循環(huán)引用不再是問題了

在上面的示例中,函數(shù)調(diào)用返回之后,兩個對象從全局對象出發(fā)無法獲取。因此,他們將會被垃圾回收器回收。
第二個示例同樣,一旦 div 和其事件處理無法從根獲取到,他們將會被垃圾回收器回收。

限制: 對象需要明確的不可獲得

盡管這是一個限制,但是很少會被突破,這也就是為什么在現(xiàn)實(shí)中很少人會去關(guān)心垃圾回收機(jī)制。

相關(guān)文章

  • js 連續(xù)賦值的簡單實(shí)現(xiàn)

    js 連續(xù)賦值的簡單實(shí)現(xiàn)

    下面小編就為大家?guī)硪黄猨s 連續(xù)賦值的簡單實(shí)現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • JavaScript 上傳文件限制參數(shù)案例詳解

    JavaScript 上傳文件限制參數(shù)案例詳解

    這篇文章主要介紹了JavaScript 上傳文件限制參數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • webpack4 處理SCSS的方法示例

    webpack4 處理SCSS的方法示例

    這篇文章主要介紹了webpack4處理SCSS的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Object.defineproperty方法示例詳解

    Object.defineproperty方法示例詳解

    Object.defineproperty?的作用就是直接在一個對象上定義一個新屬性,或者修改一個已經(jīng)存在的屬性,這篇文章主要介紹了Object.defineproperty方法,需要的朋友可以參考下
    2022-12-12
  • 利用javascript如何隨機(jī)生成一定位數(shù)的密碼

    利用javascript如何隨機(jī)生成一定位數(shù)的密碼

    這篇文章主要給大家介紹了關(guān)于利用javascript如何隨機(jī)生成一定位數(shù)的密碼的相關(guān)資料,文中給出了詳細(xì)的示例代碼,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • JavaScript純前端實(shí)現(xiàn)語音播報和朗讀功能

    JavaScript純前端實(shí)現(xiàn)語音播報和朗讀功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript純前端實(shí)現(xiàn)語音播報和朗讀功能的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • js實(shí)現(xiàn)的驗(yàn)證,學(xué)習(xí)用js控制td

    js實(shí)現(xiàn)的驗(yàn)證,學(xué)習(xí)用js控制td

    JS日積月累001 - rows 和 cells的使用
    2008-12-12
  • weUI應(yīng)用之JS常用信息提示彈層的封裝

    weUI應(yīng)用之JS常用信息提示彈層的封裝

    這篇文章主要為大家詳細(xì)介紹了weUI應(yīng)用中利用JS封裝幾個常用的信息提示彈層的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • JavaScript設(shè)置IFrame高度自適應(yīng)(兼容各主流瀏覽器)

    JavaScript設(shè)置IFrame高度自適應(yīng)(兼容各主流瀏覽器)

    IFrame高度的設(shè)置問題一直都是前端的噩夢而且還要兼容各主流瀏覽器更是難上加難了,下面與大家分享下一個不錯的技巧,感興趣的你可以參考下哈
    2013-06-06
  • JavaScript中Hoisting詳解 (變量提升與函數(shù)聲明提升)

    JavaScript中Hoisting詳解 (變量提升與函數(shù)聲明提升)

    函數(shù)聲明和變量聲明總是被JavaScript解釋器隱式地提升(hoist)到包含他們的作用域的最頂端。下面這篇文章主要給大家介紹了關(guān)于JavaScript中Hoisting(變量提升與函數(shù)聲明提升)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08

最新評論

五大连池市| 五指山市| 沙坪坝区| 安仁县| 马龙县| 会东县| 隆化县| 光山县| 邛崃市| 恩平市| 夹江县| 和硕县| 射阳县| 舒兰市| 东台市| 洮南市| 麻阳| 高碑店市| 陵川县| 梨树县| 祁阳县| 门头沟区| 葵青区| 广河县| 成都市| 四平市| 南雄市| 潍坊市| 灵武市| 宣化县| 宜川县| 砀山县| 华蓥市| 永济市| 六枝特区| 清苑县| 望江县| 巩义市| 伊宁市| 手机| 福州市|