亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript對內存分配及管理機制詳細解析

2019-11-20 21:44:42
字體:
來源:轉載
供稿:網友

你可能聽說過JAVA、.NET、PHP這些語言有垃圾回收的內存管理機制,但是很少會聽到JavaScript也有自己的內存管理機制,JavaScript同樣有著類似的垃圾回收功能。本文主要講述了JavaScript的垃圾回收原理和具體的過程。

簡介
在底層語言中,比如C,有專門的內存管理機制,比如malloc() 和 free()。而Javascript是有垃圾回收(garbage collection)機制的,也就是說JS解釋器會自動分配和回收內存。這樣就有人覺得,我用的是高級語言,就不用關心內存管理了,其實這是不對的。

內存的生命周期
盡管語言不盡相同,而每種語言中內存的生命周期都是相似的:

1.當需要的時候分配內存
2.對內存進行讀寫操作
3.當上面分配的內存不再需要的時候,將他們釋放掉
對于1,2兩步,幾乎所有語言操作起來都是明確地或者說很直觀,沒什么好說的。而在像Javascript一樣的高級語言中,第三步操作就顯得不那么直觀。

Javascript中分配內存空間
變量初始化
當變量初始化的時候,Javascript會自動分配相應的內存空間(注:這里MDN上關于這里用的是Value initialization,到底是聲明,還是在賦值時候分配空間,還要再學習一下)

var n = 123; //  為數字分配空間
var s = “azerty”; // 字符串

var o = {
a: 1,
b: null
}; // 為對象和它包含的屬性分配內存空間

var a = [1, null, "abra"]; // (類似對象)給數組和它里面的元素分配空間

function f(a){
return a + 2;
} // 為函數分配空間

//  函數有時也會為分配對象空間
someElement.addEventListener(‘click', function(){
someElement.style.backgroundColor = ‘blue'; //個人補充,未考證,這里會為someElement分配空間,如注釋所說,為對象分配空間
}, false);

函數調用時候分配空間
有的函數調用,會產生上面說的那種 為對象分配空間

var d = new Date();
var e = document.createElement('div'); // allocates an DOM element還有下面這種

var s = “azerty”;
var s2 = s.substr(0, 3); // s2 is a new string
// 由于Javascript中字符串是不可變的,所以Javascript也許并沒有為s2中的字符串分配新空間,而是只存了[0, 3]的區間(用來索引)

var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2); // 新的空間來存儲數組a3

操作變量值
沒什么好說的,讀、寫、函數調用。

內存不再被使用時,將它們釋放掉
許多內存管理機制的問題都出現在這里。最麻煩的問題是確認“這塊內存空間已經不需要了”。這往往需要程序員告知,這個程序中,這塊內存已經不需要了,你們回收吧。

而高級語言解釋器中嵌入了一個叫做“垃圾回收(garbage collector)”的工具,用來跟蹤內存分配和使用情況,以便在它們不需要的時候將其自動回收。然而有個問題,一塊內存空間是不是還有用,是具有不確定性的,也就是說,這個是沒法用算法精確算出來的。

垃圾回收
如上所述原因,垃圾回收機制采取了一種有限的解決方案來處理上面的不確定性問題。下面介紹集中垃圾回收算法的思想以及相應的局限:

引用
這種方法,用到了一種引用的思想。當a能訪問A時,就說A引用了a(不論是直接還是間接的)。比如,一個Javascript對象會引用他的原型(間接引用)和它的各個屬性(直接引用)。

這種情形下,對象就被擴展的更廣義了,在原生對象的基礎上,還包含了函數的作用域鏈(或者全局的詞法作用域)。

引用計數
這種方法是最拿衣服(naive)的垃圾回收算法。它把“可以回收”的標準定義為“沒有其他人引用這個對象”(原文:This algorithm reduces the definition of “an object is not needed anymore” to “an object has no other object referencing to it”)。也就是說,只有當對象沒有被引用的時候,才會被當作垃圾回收掉。

舉個例子
var o = { // 稱之為外層對象
a: { //稱之為內層對象
b:2
}
}; //  創建了兩個對象 內層對象作為外層對象的屬性而被引用
// 而外層對象被變量o引用
// 顯然,沒有人會被垃圾回收

var o2 = o; // o2也引用了上面說的外層對象。好現在外層對象的引用計數為‘2' (被o和o2引用)
o = 1; //  現在o不再引用外層對象,只有o2在引用,引用計數為 ‘1'

var oa = o2.a; // oa 引用內層對象
//  現在內層對象同時被作為外層對象的屬性引用和被oa引用,引用計數為‘2'

o2 = “yo”; //  好,現在o2也不引用外層對象了,外層對象引用計數為“0”
// 意味著外層對象可以被“垃圾回收”了
// 然而,內層對象還被oa引用著,因此還是沒有被回收 (個人注釋:這里有一點閉包的意味)

oa = null; //  現在oa不引用內層對象了
// 內層對象也被垃圾回收

局限:循環引用

看下面代碼:

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

return “azerty”;
}

f();
// o o2兩個對象構成了循環引用
// 當函數執行完畢的時候,他們就被關在了f的作用域里面,沒有外面的人可以使用他們
// 所以按理說,他們已經沒有存在價值了,需要被垃圾回收,釋放內存
// 然而,他們的引用計數都不為“0”
// 所以在這種引用計數的機制下,他們沒有被回收

實際例子
在IE6,7版本的瀏覽器中,就是使用的引用計數機制。因此,下面的代碼在IE6,7中可以穩穩地發生內存泄漏

var div = document.createElement("div");
div.onclick = function(){
  doSomething();
}; // div的onclick屬性,會引用 function
// 然而這個 function 反過來又引用了這個div,因為div在handler的作用域里面。
// 造成上述循環引用,導致內存泄漏。標記清除算法

這種算法把“可以回收”定義成“對象不可達”,即訪問不到。

這種算法,會定義一個“根”,并且定期地從“根”出發,找出“根”下面的所有對象,看能不能從“根”找到一條路徑引用到這個對象。從不同的“根”出發,垃圾回收程序就可以區分所有對象是不是“不可達”的,當對象“不可達”時候,便被回收。

這種算法比引用計數算法要好些。因為 “一個對象的引用計數是0”可以推出“這個對象不可達”,逆命題則為假。也就是說這種算法擴充了垃圾回收的范圍。

循環引用不再是困擾
在上面的循環引用例子中,當函數返回時,o 和 o2都已經不再被任何人引用,也就是“不可達”了,便順理成章地被垃圾回收掉了。

局限:對象需要明確的“不可達”
雖然說是局限,然而這種情況在實際當中很少發生,因此很少有人關注這一點。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线视频一区二区| 97超级碰在线看视频免费在线看| 久久久久久久av| 欧美制服第一页| 宅男66日本亚洲欧美视频| 国产精品久久久久99| 国产亚洲人成网站在线观看| 久久精品国产亚洲一区二区| 日韩视频在线观看免费| 国产精品96久久久久久| 色一情一乱一区二区| 国产精品色午夜在线观看| 欧美大秀在线观看| 美女少妇精品视频| 国产99久久精品一区二区| 国产v综合v亚洲欧美久久| 国产日韩换脸av一区在线观看| 欧美精品videosex牲欧美| 国内精品美女av在线播放| 亚洲国产一区二区三区在线观看| 精品香蕉一区二区三区| 欧美性猛交99久久久久99按摩| 北条麻妃在线一区二区| 亚洲精品视频中文字幕| 亚洲精品www| 色婷婷av一区二区三区在线观看| 97成人精品视频在线观看| 日韩www在线| 亚洲天堂网站在线观看视频| y97精品国产97久久久久久| 亚洲女成人图区| 操日韩av在线电影| 国产免费一区二区三区香蕉精| 日韩av电影中文字幕| 欧美激情亚洲国产| 色婷婷久久av| 亚洲国产精品久久久久秋霞不卡| 欧美性xxxx极品高清hd直播| 成人看片人aa| 欧美日韩国产91| 日韩av123| 久久精品欧美视频| 亚洲图片欧美日产| 欧亚精品中文字幕| 亚洲女人天堂网| 国产欧美一区二区三区久久| 久久中文精品视频| 国产精品揄拍一区二区| 亚洲欧洲国产伦综合| 91久久国产精品91久久性色| 国产精品久久一| 亚洲成色777777在线观看影院| 91香蕉嫩草神马影院在线观看| 久久久久久亚洲精品不卡| 孩xxxx性bbbb欧美| 欧美尺度大的性做爰视频| 亚洲精品综合精品自拍| 欧美精品一区在线播放| 国产美女久久精品香蕉69| 国产精品久久久久久久久久| 成人精品福利视频| 欧美日韩美女视频| 亚洲日本aⅴ片在线观看香蕉| 色哟哟网站入口亚洲精品| 在线精品国产欧美| 精品国产欧美一区二区三区成人| 精品中文字幕在线2019| 色综合久久88色综合天天看泰| 亚洲一区二区三区视频| 国产精品久久综合av爱欲tv| 亚洲人精选亚洲人成在线| 国产精品1区2区在线观看| 国产精品va在线| 欧美性极品xxxx做受| 亚洲韩国日本中文字幕| 国产精品99久久久久久久久| 国产精品视频一区二区三区四| 九九久久精品一区| 欧美激情一二三| 亚洲精品第一页| 国产精品电影观看| 日本欧美一级片| 一区二区三区高清国产| 国产精品一区二区三区久久| 日韩精品免费在线| 国产ts人妖一区二区三区| 精品视频www| 欧美最近摘花xxxx摘花| 这里只有视频精品| 国产精品久久久久久久久久免费| 欧美高清在线视频观看不卡| 美日韩精品免费观看视频| 日本高清视频精品| 国产不卡精品视男人的天堂| 成人午夜黄色影院| 久久久久久国产免费| 亚洲精品小视频| 欧美又大又硬又粗bbbbb| 国产日本欧美在线观看| 亚洲自拍偷拍福利| 亚洲精品久久久久国产| 国产日韩欧美成人| 日本高清久久天堂| 久久综合免费视频影院| 欧美视频一二三| 欧美尤物巨大精品爽| 欧美日韩在线看| 欧美性xxxx在线播放| 国产欧美日韩免费看aⅴ视频| 亚洲一区av在线播放| 亚洲国产中文字幕久久网| 久久亚洲国产精品| 国产精品久久久久久久久男| 国产精品99久久久久久www| 91日本在线观看| 久久在线观看视频| 日本在线观看天堂男亚洲| 欧美另类精品xxxx孕妇| 夜夜嗨av色综合久久久综合网| 欧美日韩在线视频观看| 日韩美女视频中文字幕| 日本a级片电影一区二区| 一本一本久久a久久精品综合小说| 国产精品第10页| 韩国国内大量揄拍精品视频| 国产欧美日韩精品专区| 国产精品美女av| 欧美亚洲一区在线| 555www成人网| 国产午夜精品免费一区二区三区| 国产精品va在线播放我和闺蜜| …久久精品99久久香蕉国产| 91在线视频精品| 日韩欧美在线视频日韩欧美在线视频| 色噜噜狠狠狠综合曰曰曰88av| 91麻豆桃色免费看| 国产精品久久久久7777婷婷| 欧美日韩国产va另类| 成人黄色影片在线| 国产精品美女999| 午夜精品久久久99热福利| 日韩在线视频国产| 成人av在线亚洲| 91精品国产乱码久久久久久久久| 精品视频久久久久久| 亚洲成av人乱码色午夜| 热久久99这里有精品| 亚洲美女av电影| 精品国产乱码久久久久久婷婷| 久久影院中文字幕| 久久91超碰青草是什么| 欧美日韩不卡合集视频| 精品少妇一区二区30p| 国产亚洲视频在线观看| 亚洲偷欧美偷国内偷| 日韩在线免费av| 欧美性20hd另类| 国产成人综合精品在线| 黑人巨大精品欧美一区二区三区| 97视频在线免费观看| 亚洲自拍偷拍在线| 永久免费看mv网站入口亚洲| 日本免费一区二区三区视频观看| 欧美视频在线免费看|