国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

閉包會造成內存泄漏嗎?

opengps / 2001人閱讀

摘要:前言在談內存泄漏這個問題之前先看看的垃圾收集機制,具有自動垃圾收集機制,就是找出那些不再繼續使用的變量,然后釋放其占用的內存。閉包不會引起內存泄漏由于之前的版本對對象和對象使用不同的垃圾收集。因此閉包在的這些版本中會導致一些特殊的問題。

前言

在談內存泄漏這個問題之前先看看JavaScript的垃圾收集機制,JavaScript 具有自動垃圾收集機制,就是找出那些不再繼續使用的變量,然后釋放其占用的內存。為此,垃圾收集器會按照固定的時間間隔(或代碼執行中預定的收集時間)。常用的的方法有兩種,即標記清楚引用計數

1. 標記清除

JavaScript 中最常用的垃圾收集方式是標記清除(mark-and-sweep)。垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記(可以使用任何標記方式)。然后,它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。最后,垃圾收集器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間。

1. 引用計數

引用計數(reference counting)的含義是跟蹤記錄每個值被引用的次數。當聲明了一個變量并將一個引用類型值賦給該變量時,則這個值的引用次數就是1。如果同一個值又被賦給另一個變量,則該值的引用次數加1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數減1。當這個值的引用次數變成0 時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內存空間回收回來。這樣,當垃圾收集器下次再運行時,它就會釋放那些引用次數為零的值所占用的內存。

Netscape Navigator 3.0 是最早使用引用計數策略的瀏覽器,但很快它就遇到了一個嚴重的問題,請看下面這個例子:

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

說明:objectA 和objectB 通過各自的屬性相互引用,即這兩個對象的引用次數都是2,在采用標記清除策略的實現中,由于函數執行之后,這兩個對象都離開了作用域,因此這種相互引用不是個問題。但在采用引用計數策略的實現中,當函數執行完畢后,objectA 和objectB 還說明將繼續存在,因為它們的引用次數永遠不會是0。假如這個函數被重復多次調用,就會導致大量內存得不到回收。

為此,Netscape 在Navigator 4.0 中放棄了引用計數方式,然而引用計數導致的麻煩并未就此了結。IE9以前中有一部分對象并不是原生JavaScript 對象。例如,其BOM 和DOM 中的對象就是使用C++以COM(Component Object Model,組件對象模型)對象的形式實現的,而COM 對象的垃圾收集機制采用的就是引用計數策略。因此,即使IE 的JavaScript 引擎是使用標記清除策略來實現的,但JavaScript 訪問的COM 對象依然是基于引用計數策略的。換句話說,只要在IE 中涉及COM 對象,就會存在循環引用的問題
比如:

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 從頁面中移除,它也永遠不會被回收。

解決辦法:將變量設為null從而切斷變量與它此前引用的值之間的連接。

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

看完上面的內容,我來談正題。

閉包不會引起內存泄漏

由于IE9 之前的版本對JScript 對象和COM 對象使用不同的垃圾收集。因此閉包在IE 的這些版本中會導致一些特殊的問題。具體來說,如果閉包的作用域鏈中保存著一個HTML 元素,那么就意味著該元素將無法被銷毀
請看例子:

function assignHandler(){
    var element = document.getElementById("someElement");
    element.onclick = function(){
        alert(element.id);
    };
}

以上代碼創建了一個作為element 元素事件處理程序的閉包,而這個閉包則又創建了一個循環引用。由于匿名函數保存了一個對assignHandler()的活動對象的引用,因此就會導致無法減少element 的引用數。只要匿名函數存在,element 的引用數至少也是1,因此它所占用的內存就永遠不會被回收

解決辦法前言已經提到過,把element.id 的一個副本保存在一個變量中,從而消除閉包中該變量的循環引用同時將element變量設為null。

function assignHandler(){
    var element = document.getElementById("someElement");
    var id = element.id;
    element.onclick = function(){
        alert(id);
    };
    element = null;
}

總結:閉包并不會引起內存泄漏,只是由于IE9之前的版本對JScript對象和COM對象使用不同的垃圾收集,從而導致內存無法進行回收,這是IE的問題,所以閉包和內存泄漏沒半毛錢關系。
這篇文章里做了詳細的測試,有興趣的可以點擊查看

小小插曲:發個群鏈接,有興趣的可以加入交流,群號:519875573

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91124.html

相關文章

  • JS高程中的垃圾回收機制與常見內存泄露的解決方法

    摘要:解決方式是,當我們不使用它們的時候,手動切斷鏈接淘汰把和對象轉為了真正的對象,避免了使用這種垃圾收集策略,消除了以下常見的內存泄漏的主要原因。以上參考資料高程垃圾收集類內存泄漏及如何避免內存泄露及解決方案詳解類內存泄漏及如何避免 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1ft1ikzcqzqj30ka0et77a.jpg); 前言 起...

    kidsamong 評論0 收藏0
  • 閉包引出的垃圾回收

    摘要:就會造成內存泄漏這里導致一直存在內存中應該將解除引用來避免內存泄漏這里導致一致存在內存中的垃圾回收機制看完內存泄漏需要了解下的垃圾回收機制,首先具有自動垃圾回收機制,會找出不再使用的變量,然后釋放其占用的內存。 由閉包引出的垃圾回收 閉包的特性 函數嵌套函數 函數內部可以引用外部的參數和變量 參數和變量不會被垃圾回收機制回收 閉包的定義 閉包 是指有權訪問另一個函數作用域中的變量的...

    MoAir 評論0 收藏0
  • VueJS SSR 后端繪制內存泄漏的相關解決經驗

    摘要:積少成多,最后造成內存泄漏。前端內存泄漏的影響,都是發生在客戶機器上,而且基本上現代瀏覽器也會做好保護機制,一般自行刷新之后都會解決。但是,一旦后端繪制內存泄漏造成宕機之后,整個服務器都會受影響,危險性更大,搞不好年終獎就沒了。 引言 Memory Leak 是最難排查調試的 Bug 種類之一,因為內存泄漏是個 undecidable problem,只有開發者才能明確一塊內存是不是需...

    lifesimple 評論0 收藏0
  • javascript典型內存泄漏及chrome的排查方法

    摘要:的內存泄漏對于這門語言的使用者來說,大多數的使用者的內存管理意識都不強。內存泄漏的定義指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。 javascript的內存泄漏 對于JavaScript這門語言的使用者來說,大多數的使用者的內存管理意識都不強。因為JavaScript一直以來都只作為在網頁上使用的腳本語言,而網頁往往都不會長時間的運行,所以使用者對JavaScript的...

    HackerShell 評論0 收藏0
  • Node.js內存管理和V8垃圾回收機制

    摘要:垃圾回收內存管理實踐先通過一個來看看在中進行垃圾回收的過程是怎樣的內存泄漏識別在環境里提供了方法用來查看當前進程內存使用情況,單位為字節中保存的進程占用的內存部分,包括代碼本身棧堆。 showImg(https://segmentfault.com/img/remote/1460000019894672?w=640&h=426);作者 | 五月君Node.js 技術棧 | https:...

    JowayYoung 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<