91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中垃圾回收機制詳解

發布時間:2020-11-03 17:28:06 來源:億速云 閱讀:151 作者:Leah 欄目:開發技術

JavaScript中垃圾回收機制詳解?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

   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中垃圾回收機制詳解問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河源市| 三台县| 疏附县| 丽江市| 无锡市| 连云港市| 建阳市| 洪泽县| 社会| 萝北县| 喀喇沁旗| 漠河县| 宜兰市| 许昌县| 库尔勒市| 申扎县| 平顺县| 乐安县| 黑水县| 虎林市| 依兰县| 北票市| 宝应县| 清苑县| 泰顺县| 讷河市| 商丘市| 胶南市| 嘉祥县| 张家界市| 聊城市| 平阳县| 临夏市| 浠水县| 朝阳县| 曲松县| 宁安市| 祁东县| 武山县| 万盛区| 阳城县|