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

首頁 > 語言 > JavaScript > 正文

JavaScript內存管理介紹

2024-05-06 16:16:43
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript內存管理介紹,本文講解了內存生命周期、JavaScript的內存分配、通過函數調用的內存分配、當內存不再需要使用時釋放等內容,需要的朋友可以參考下
 

簡介

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

內存生命周期

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

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

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

JavaScript的內存分配

變量初始化

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

 

復制代碼代碼如下:

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';
}, false);

 

通過函數調用的內存分配

有些函數調用結果是分配對象內存:

復制代碼代碼如下:

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

 

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

 

復制代碼代碼如下:

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

 

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

 

值的使用

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

當內存不再需要使用時釋放

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

高級語言解釋器嵌入了“垃圾回收器”,主要工作是跟蹤內存的分配和使用,以便當分配的內存不再使用時,自動釋放它。這個過程是一個近似的,因為要知道某塊內存是否需要是 無法判定的 (無法被某種算法所解決).

垃圾回收

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

引用

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

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

引用計數垃圾收集

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

例如

復制代碼代碼如下:

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

 

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

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

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

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

 

限制:循環引用

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

復制代碼代碼如下:

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

 

  return "azerty";
}

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

 

實際當中的例子

IE 6, 7 對DOM對象進行引用計數回收。對他們來說,一個常見問題就是內存泄露:

復制代碼代碼如下:

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

 

標記-清除算法

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

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

這個算法比前一個要好,因為“有零引用的對象”總是不可獲得的,但是相反卻不一定,參考“循環引用”。

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

循環引用不再是問題了

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

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

盡管這是一個限制,但是很少會被突破,這也就是為什么在現實中很少人會去關心垃圾回收機制。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲在线播放| 亚洲视频777| 亚洲人av在线影院| 久久久久久久一区二区三区| 丰满岳妇乱一区二区三区| 91在线直播亚洲| 国产精品一区二区三区免费视频| 亚洲国产精品久久久久| 亚洲第一区在线观看| 日韩免费观看在线观看| 中文字幕亚洲无线码a| 久久久免费电影| 97免费在线视频| 欧美成人一二三| 久久偷看各类女兵18女厕嘘嘘| 国产精品一香蕉国产线看观看| 欧美麻豆久久久久久中文| 亚洲第一视频网| 日韩av有码在线| 国产区亚洲区欧美区| 精品国产欧美一区二区五十路| 久久综合免费视频影院| 国产精品久久久久99| 国产精品专区h在线观看| 伊人亚洲福利一区二区三区| 免费av在线一区| 久久久久久亚洲精品不卡| 欧美视频一区二区三区…| 国产激情综合五月久久| 96精品视频在线| 精品美女国产在线| 久久精品99久久久香蕉| 亚洲欧美成人一区二区在线电影| 精品久久久久久久久久| 亚洲精品欧美日韩专区| 2019中文在线观看| 中文字幕av日韩| 中文字幕在线观看日韩| 欧美大片免费观看| 日韩黄色高清视频| 成人免费在线视频网站| 亚洲国产天堂久久国产91| 91精品国产91久久久久久最新| 在线看国产精品| 日韩久久免费电影| 亚洲视频日韩精品| 欧美性xxxx极品hd满灌| 亚洲国产成人精品女人久久久| 国语自产精品视频在线看| 国内揄拍国内精品少妇国语| 精品人伦一区二区三区蜜桃免费| 情事1991在线| 久久精品国产免费观看| 亚洲国产欧美一区| 欧美精品久久久久久久| 久久中文精品视频| 91精品视频一区| www.亚洲天堂| 91影院在线免费观看视频| 伊人精品在线观看| 青青草一区二区| 亚洲男人第一网站| 久久久精品国产一区二区| 高清视频欧美一级| 欧美日韩久久久久| 亚洲国产成人精品一区二区| 久久九九精品99国产精品| 国产精品69久久| 国产精品扒开腿做爽爽爽视频| 亚洲理论在线a中文字幕| 中文字幕日本精品| 97国产精品人人爽人人做| 精品国产乱码久久久久酒店| 国产精品成人免费视频| 精品香蕉在线观看视频一| 亚洲一区中文字幕| 日本一区二三区好的精华液| 国产成人精品久久二区二区91| 操91在线视频| 日韩精品中文在线观看| 亚洲片国产一区一级在线观看| 国产精品尤物福利片在线观看| 欧美精品一区二区三区国产精品| 国产在线拍揄自揄视频不卡99| 91精品视频免费观看| 欧美中文字幕在线视频| 亚洲片国产一区一级在线观看| 久久久久久国产精品久久| 91禁国产网站| 日韩小视频在线| 一二美女精品欧洲| 欧美精品在线观看91| 国产一区二区三区在线看| 日本成人精品在线| 亚洲男人的天堂在线| 欧美国产在线视频| 日韩中文字幕久久| 亚洲精品一区二区在线| 九九热精品视频| 欧美日韩在线影院| 日韩av在线直播| 国产精品视频网| 欧美成人手机在线| 庆余年2免费日韩剧观看大牛| 国产精品美女主播在线观看纯欲| 欧美日韩国产成人在线| 韩曰欧美视频免费观看| 欧美性猛交xxxxx水多| 人人澡人人澡人人看欧美| 国产精品视频区| 亚洲深夜福利视频| 久久久噜噜噜久噜久久| 欧美xxxwww| 国产精品专区第二| 中文字幕亚洲精品| 国产精品流白浆视频| 555www成人网| 亚洲小视频在线观看| 久久久这里只有精品视频| 欧美另类精品xxxx孕妇| 国产精品18久久久久久首页狼| 国产精品久久一区主播| 91在线视频一区| 日韩中文字幕网| 久久久久久18| 亚洲福利在线看| www国产精品com| 久久精品国产2020观看福利| 国产视频自拍一区| 国产综合香蕉五月婷在线| 欧美日韩中文字幕在线| 亚洲图片在区色| 久久精品在线播放| 2020国产精品视频| 日本道色综合久久影院| 国产91成人video| 91天堂在线观看| 国产日韩欧美电影在线观看| 国产精品视频xxxx| 精品免费在线视频| 国产欧美一区二区| 91亚洲国产成人久久精品网站| 久久精品美女视频网站| 91久久精品国产91久久性色| 日韩成人在线网站| 亚洲成人av片| 在线精品国产欧美| 久久91亚洲精品中文字幕| 亚洲欧洲自拍偷拍| 色妞久久福利网| 成人精品视频在线| 欧美xxxx做受欧美.88| www.日本久久久久com.| 亚洲精品一区二三区不卡| 91久久国产精品91久久性色| 成人精品网站在线观看| 久久综合五月天| 国产精品扒开腿做爽爽爽的视频| 亚洲va欧美va国产综合剧情| 久久亚洲电影天堂| 欧美性猛交xxxx偷拍洗澡| 欧美日韩一区二区三区在线免费观看| 国产日韩在线亚洲字幕中文| 精品日韩美女的视频高清|