首頁  >  文章  >  web前端  >  淺析JS垃圾收集機制與記憶體管理

淺析JS垃圾收集機制與記憶體管理

零到壹度
零到壹度原創
2018-04-04 14:36:241166瀏覽

這篇文章主要介紹了淺析JS垃圾收集機制和記憶體管理,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

  垃圾收集

  javascript中的垃圾收集機制很簡單:找出那些不在使用的變數,然後釋放他們.

#    局部變數只存在在函數執行過程中,所以,當函數執行結束之後,局部變數就沒有存在的必要了.但是並不是所有的變數都是那樣容易判斷的,所以要用一些方法來回收這些變數

    1 標記清除:

    javascript中最常用的垃圾收集方式是清除標記.當變數進入環境時,將這個變數標記為"進入環境" ,當變數離開環境時,將變數標記為"離開環境",一般來說,咱們只會清除帶有離開環境標記的變數,因為已經沒辦法存取他們了.然後垃圾收集器來完成記憶體清除工作.

    2 引用計數:

    這個方法不是那麼常用.引用計數的意思就是記錄每個值被引用的次數,當被引用的次數減為0的時候,則說明再也沒有辦法存取那個值了,所以可以將它佔用的記憶體釋放.

    但是引用計數有一個問題:循環引用.舉個例子:

##    


function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}

    在這個例子中,在這個例子中,objectA 和objectB 透過各自的屬性互相引用;也就是說,這兩個物件的引用次


#數都是2。在採用標記清除策略的實作中,由於函數執行之後,這兩個物件都離開了作用域,因此這種相互引用不是個問題。但在採用引用計數策略的實作中,當函數執行完畢後,objectA 和objectB 也會繼續存在,因為它們的引用次數永遠不會是0。假如這個函數被重複多次調用,就會導致大量內存得不到回收

    為了避免這樣的問題,咱們要在不使用他們的時候將他們置為null,以消除循環引用


記憶體管理:

   我們都知道分配給網頁瀏覽器的可用記憶體數量通常比分配給桌面應用程式的少。這樣做的目的主要是出於安全性方面的考慮,目的是防止執行JavaScript 的網頁耗盡全部系統記憶體而導致系統崩潰。記憶體限制問題不僅會影響給變數分配內存,同時還會影響呼叫堆疊以及在一個執行緒中能夠同時執行的語句數量。


    因此,確保佔用最少的記憶體可以讓頁面獲得更好的效能。而優化記憶體佔用的最佳方式,就是為執行 中的程式碼只保存必要的資料。一旦資料不再有用,最好透過將其值設為null 來釋放其引用——這個 做法叫做解除引用(dereferencing)。這做法適用於大多數全域變數和全域物件的屬性。局部變數會在 它們離開執行環境時自動被解除引用,如下面這個範例所示:


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

    解除數值的參考並不表示自動回收該值所佔用的記憶體。解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。


相關推薦:

java垃圾回收機制、記憶體管理

JS的垃圾回收機制與記憶體分配

#JavaScript垃圾收集機制及記憶體洩漏問題#

以上是淺析JS垃圾收集機制與記憶體管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn