SORU
5 Kasım 2013, Salı


Nasıl JavaScript kapatma çöp toplanır

Aşağıdaki açmış olduğum Şifremi ve çok açık olmayan pek çok ciddi bellek sızıntıları yol açan Chrome bug,:

(Bu sonuçlar, Chrome Dev Tools' GC çalışır, ve sonra her şey değil garbaged bir yığın fotoğrafını çeker memory profiler, toplanan.) kullanın

Aşağıdaki kod someClass örnek çöp (iyi) toplanır:

var someClass = function() {};

function f() {
  var some = new someClass();
  return function() {};
}

window.f_ = f();

Ama bu durumda çöp toplama () kötü olmaz:

var someClass = function() {};

function f() {
  var some = new someClass();
  function unreachable() { some; }
  return function() {};
}

window.f_ = f();

İlgili ekran görüntüsü:

screenshot of Chromebug

Öyle görünüyor ki bir kapatma (bu durumda, function() {}) tutar tüm nesneleri "canlı" nesne tarafından başvurulan başka bir kapatma aynı bağlam olsun olmasın, eğer kapatma kendisi bile ulaşılabilir.

Benim sorum diğer tarayıcılarda kapatılması (IE 9 ve Firefox hakkında çöp toplama. Y aletleri, JavaScript yığın profiler gibi oldukça aşinayım, ama ben diğer tarayıcıları küçük araçlar, bu yüzden test edemedim.

Bu üç olgunun 9 ve Çöp toplamak Firefox olacaksomeClassörnek?

CEVAP
5 Kasım 2013, Salı


Söyleyebileceğim kadarıyla, bu bir hata ama beklenen davranış değildir.

Memory management page Mozilla: "2012, tüm modern tarayıcılar Gibi mark & sweep çöp toplayıcısı bir gemi.""Sınırlama:nesneleri açıkça ulaşılamaz yapılması gerekir".

Başarısız örnekler some hala kapatılması ulaşılabilir. Onu ulaşılmaz yapmak için iki yol denedim ve çalışıyor. Ya da artık ihtiyacın yok, ya da window.f_ = null; ayarlayın ve yok olacaklar some=null ayarlayın.

Güncelleme

Windows üzerinde 30, FF25, 12 Opera ve IE10 Chrome denedim.

standard çöp toplama hakkında bir şey söylemiyor, ama ne olacağını bazı ipuçları verir.

  • Bölüm 13 Fonksiyon tanımı, adım 4: "kapatma 13.2'de belirtildiği gibi yeni bir İşlev nesnesi oluşturma sonucu olsun"
  • Bölüm 13.2 "Sözlü bir Çevre tarafından belirtilen Kapsamı" (scope = kapatma)
  • Bölüm 10.2 Sözlü Ortamlar:

"(İç) Sözlü bir Çevre dış referans Sözlü ortamla akla başvurusu çevreleyen iç Sözlü Ortam.

Dış Sözlü bir Ortam, tabii ki, kendi dış olabilir Sözlü Ortamı. Sözlü bir Ortam birden fazla Sözcük için iç ve dış ortam olarak hizmet edebilir Ortamlar. Örneğin, birBildirim Fonksiyonuiç içe iki içerirİşlev Bildirimlerisonra Sözlü İç içe geçmiş fonksiyonların her birinin dış ortamlarda Sözlü çevreleri olarak Sözlü olacak Çevredeki fonksiyon mevcut yürütme ortamı."

Yani, bir işlevi üst çevre erişebilir.

Yani, some döndürme işlevi kapatılmasında kullanılabilir olmalıdır.

Neden her zaman kullanılabilir değil mi?

Görünen o ki Chrome ve FF zeki ortadan kaldırmak için değişken bazı durumlarda, ama hem Opera ve IE some değişken kullanılabilir kapatılması (NOT: görünüm bu set kesme return null ve onay debugger).

GC some kullanılan olup olmadığını tespit etmek için geliştirilmiş veya fonksiyonlar olabilir, ama karmaşık olacaktır.

Kötü bir örnek:

var someClass = function() {};

function f() {
  var some = new someClass();
  return function(code) {
    console.log(eval(code));
  };
}

window.f_ = f();
window.f_('some');

GC yukarıdaki örnekte varsa kullanılan değişken olup olmadığını bilmenin bir yolu (kodu Test ve Chrome30, FF25, 12 Opera ve IE10 çalışır).

Bellek eğer nesne referansı window.f_ başka bir değer atayarak kırık ise serbest bırakılır.

Bence bu bir hata değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • HowtoDrawAndPaint

    HowtoDrawAnd

    24 EKİM 2010
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006