1. 程式人生 > >JavaScript的垃圾回收機制

JavaScript的垃圾回收機制

垃圾回收器 聲明 過程 賦值 cti 變量 global light 垃圾回收

原文

  https://www.jianshu.com/p/4aa1a29781cc

大綱

  1、認識垃圾回收機制
  2、垃圾回收機制的原理
  3、垃圾回收機制的標記策略
  4、垃圾回收機制與內存管理

1、認識垃圾回收機制

  JavaScript具有自動垃圾收集機制,也就是說,執行環境會負責管理代碼在執行環境過程中使用的內存。
  垃圾收集器會按照固定的時間間隔(或代碼執行中預定的收集時間),周期性的執行這一操作。
  垃圾回收機制的作用就是將釋放某個不再被使用的變量所占用的內存。
  垃圾回收機制的存在是為了不讓內存總是被消耗而沒有釋放,這樣整個系統無法支持更為龐大的運算。
  垃圾回收機制不是總是那麽高效,其不是總在運行,因此有時需要我們人為的釋放被占用的內存,從而使程序能夠支持更為龐大的運算,能夠接受更為巨量的數據運算。

2、垃圾回收機制的原理

  垃圾收集機制的原理:找出那些不再繼續使用的變量,然後釋放其占用的內存。

3、垃圾回收機制的標記策略

  垃圾收集器必須跟蹤哪個變量有用哪個變量沒用,對於不再有用的變量打上標記,以備將來收回其占用的內存。用於標識無用變量的策略可能會因實現而異,但具體到瀏覽器中的實現,則通常有兩個策略:標記清除、引用計數。

3.1、標記清除

  當變量進入環境時,將其標記為“進入環境”,當變量離開環境時,將其標記為“離開環境”(常用)。

3.2、引用計數

  跟蹤記錄每個值被引用的次數。當聲明一個變量並將一個引用類型賦值給該變量時,這個值引用次數就是1,如果同一個值又被賦給另一個變量,則該值的引用次數加1,相反,如果包含這個值一弄的變量又取得了另一個值(也就是前面的引用被覆蓋,不再引用前面那個值),則這個值的引用次數減1。當這個值的引用次數變成0時,則說明沒有辦法再訪問這個值,因而就可以將其占用的內存空間回收回來。(少見,幾乎不用,除了早版IE的元素JS,因為會出現循環引用的問題)。

4、垃圾回收機制與內存管理

  垃圾回收器是周期運行的,而且如果為變量分配的內存數量很可觀,那麽回收工作量也是相當大的。觸發方式的改善很重要。

4.1、管理內存

  雖然說使用具備垃圾回收機制的語言寫程序,開發人員一般不必操心內存管理的問題。但是JavaScript在進行內存管理及垃圾收集時面臨的問題還是有點與眾不同的,其中最主要的問題之一,就是為了處於安全方面考慮,防止運行JavaScript的網頁耗盡全部系統內存而導致系統崩潰,所以分配給Web瀏覽器的內存數量通常比分配給桌面應用的程序少。

4.2、優化

  確定占用最少的內存可以讓頁面獲得更好的性能。而優化內存占用最佳方式,就是執行中的代碼只保存必要的數據。一旦數據不再有用,最好通過將其值設置為null來釋放其引用——這個做法叫做解除引用。這一做法適用於大多數全局變量和全局對象的屬性。局部變量會在它們離開執行環境時自動解除引用。
解除一個值的引用並不意味著自動回收該值所占用的內存。解除引用的真正作用是讓值脫離執行環境,以便垃圾回收器下次運行時將其回收。

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

  

JavaScript的垃圾回收機制