亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

談談JavaScript中的垃圾回收機制

瀏覽:35日期:2023-10-13 08:29:22

JavaScript 具有自動垃圾收集機制,也就是說,執行環境會負責管理代碼執行過程中使用的內存。

在編寫 JavaScript 程序時,開發人員不用再關心內存使用問題,所需內存的分配以及無用內存的回收完全實現了自動管理。

這種垃圾收集機制的原理其實很簡單:找出那些不再繼續使用的變量,然后釋放其占用的內存。為此,垃圾收集器會按照固定的時間間隔(或代碼執行中預定的收集時間), 周期性地執行這一操作。

具體到瀏覽器中的實現,則通常有兩個策略,分別為標記清除和引用計數。

一、標記清除

JavaScript 中最常用的垃圾收集方式是標記清除(mark-and-sweep)。當變量進入環境(例如,在函數中聲明一個變量)時,就將這個變量標記為“進入環境”。而當變量離開環境時,則將其標記為“離開環境”。

垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記。可以使用任何標記方式,比如,可以通過翻轉某個特殊的位來記錄一個變量何時進入環境, 或者使用一個“進入環境的”變量列表及一個“離開環境的”變量列表來跟蹤哪個變量發生了變化。

然后,它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。

最后,垃圾收集器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間。

二、引用計數

另一種不太常見的垃圾收集策略叫做引用計數(reference counting)。引用計數的含義是跟蹤記錄每個值被引用的次數。

當聲明了一個變量并將一個引用類型值賦給該變量時,則這個值的引用次數就是 1。 如果同一個值又被賦給另一個變量,則該值的引用次數加 1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數減 1。

當這個值的引用次數變成 0 時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內存空間回收回來。

這樣,當垃圾收集器下次再運行時,它就會釋放那些引用次數為零的值所占用的內存。

存在的問題:只要在 IE 中涉及 COM(Component Object Model,組件對象模型)對象,就會存在循環引用的問題。如下面代碼所示:

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

這個例子在一個 DOM 元素(element)與一個原生 JavaScript 對象(myObject)之間創建了循環引用。

其中,變量 myObject 有一個名為 element 的屬性指向 element 對象。

而變量 element 也有 一個屬性名叫 someObject 回指 myObject。

由于存在這個循環引用,即使將例子中的 DOM 從頁面中移除,它也永遠不會被回收。

解決方法:最好是在不使用它們的時候手工斷開原生 JavaScript 對象與 DOM 元素之間的連接。

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

將變量設置為 null 意味著切斷變量與它此前引用的值之間的連接。當垃圾收集器下次運行時,就會刪除這些值并回收它們占用的內存。

三、管理內存

確保占用最少的內存可以讓頁面獲得更好的性能。而優化內存占用的最佳方式,就是為執行中的代碼只保存必要的數據。

一旦數據不再有用,最好通過將其值設置為 null 來釋放其引用——這個做法叫做解除引用(dereferencing)。

這一做法適用于大多數全局變量和全局對象的屬性。局部變量會在它們離開執行環境時自動被解除引用,如下面這個例子所示:

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

   變量 globalPerson 取得了 createPerson()函數返回的值。在 createPerson() 函數內部,我們創建了一個對象并將其賦給局部變量localPerson,然后又為該對象添加了一個名為 name 的屬性。最后,當調用這個函數時,localPerson 以函數值的形式返回并賦給全局變量 globalPerson。

由于 localPerson 在 createPerson()函數執行完畢后就離開了其執行環境,因此無需我們顯式地去為它解除引用。

但是對于全局變量 globalPerson 而言,則需要我們在不使用它的時候手工為它解除引用,這也正是上面例子中最后一行代碼的目的。

以上就是談談JavaScript中的垃圾回收機制的詳細內容,更多關于JavaScript 垃圾回收的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 美女国产精品福利视频 | 中国一及黄色片 | 国产免费高清福利拍拍拍 | 欧美毛片免费 | 亚洲国产精品久久综合 | 亚洲综合偷自成人网第页 | 在线看片视频 | 一区二区三区在线观看视频 | 国产成人精品在视频 | 快射视频欧美 | 女色婷婷网 | 黄色激情小视频 | 国产又黄又爽又色视频观看免费 | 国产伦一区二区三区免费 | 搜索黄色毛片 | 啪啪99久久综合精品色 | 小明成人永久在线看 | 色视频一区 | 国产凹凸一区在线观看视频 | 国产成人综合网在线播放 | 日韩不卡一区二区三区 | 国内精品久久久久久影院老狼 | 草草青青| 亚洲精品91香蕉综合区 | 毛片在线播放网址 | 黑人巨大进入美女深处的视频 | 欧美一级黄 | 欧美日韩在线观看视频 | 国产成人免费手机在线观看视频 | 免费国产网站 | 亚洲欧美中文日韩v在线观看 | 精品国产免费一区二区三区五区 | 曰本女人一级毛片看一级毛 | 国产在线观看高清精品 | 高清无遮挡在线观看 | 2015日韩永久免费视频播放 | 国产在线精品一区二区三区 | 麻豆精品传媒成人精品 | 免费黄色小视频 | 91视频免费观看高清观看完整 | 91视频丝袜 |