2014-05-09 17 views
6

Google Chrome Dev Araçları ile hafıza sızıntıları Uygulamamı ayıklama edildi. jQuery'nin AJAX bellek yanıtı sızıntısı mı? Öbek Fotoğraf ve garip bir şey fark ettik:

JSON büyük bir blog getirmesi ve görünüşe ham Tepki Metin benim app bellek sızıntısı neden bellekte etrafında taşıyorsa bir AJAX istekte bulundu. Ben vanilya JS aynı denemeyi yaparsanız

Bu çok büyük bir bellek $ .ajax yılında sızıntı var ki bana pek mümkün görünüyordu, ama bu durumun nedenine bir açıklama için umuyordum ... kaçak değil gösterilen.

1) Saf JavaScript XHR

2) gösterilen http://fiddle.jshell.net/HZmT5/2/show/light/

  • ekran görüntüsü: XHR isteğe tüm HTTP yanıt etrafında sıkışmış bellek. "Anlık görüntü 1", düğmeye basılmadan önce. "Anlık görüntü 2" sonra. Aşağıdaki ekran görüntüsüne dikkat edin ve Yığın öncesi/sonrası Karşılaştırması.

    aynı davranış

    saf-JS sürümünde yeniden üretilmedi.

    enter image description here

  • +0

    '$ .getJSON' ifadesinin bir söz vermesiyle ilgili olabilir. –

    +0

    @JulianAubourg Bunu önlemek için bir geçici çözüm var mı? JQuery hatası mı yoksa beklenen davranış mı? – philfreo

    +0

    Peki, tüm ajax yardımcılarının bir söz vermesi beklenen davranışlardır (ve böylece JSON, sözün ömrü boyunca bellekte tutulur). Gereksiz bellek tutulmasını önlemek için XHR nesnesini devre dışı bırakmaya özen gösterdik. Garip olan şu ki, söz konusu davada çöp toplayıcı tarafından iadesi yapılmıyor. –

    cevap

    5

    Bu video aslında orada göstermektedir (tam JSON nesnesi yığın kalmasını Elbette DOM'da beri HTMLDivElement hala yığın kalır, ancak gereksiz görünüyor) bellek sızıntısı yok. jQuery dizenin yeni sürümünü getirir ve v8 eskisini serbest bırakır. Bu davranışın nedeni, V8 motoru optimizasyonu için birçok farklı hile kullanır ve iç yapıları ve oluşturulan kodun içindeki bir nesneye bir başvuru tutmak olabileceği bir gerçektir.

    videoda mavi çubukların profilci v8 yığın yeni nesneler/dizeleri bulundu sürede anlar. V8 bu nesneleri bir çöp olarak topladığında çubuklar gri olur.

    +0

    Videonuz, birden fazla ajax getirildiğinde yalnızca bir uzun mavi çubuğun kaldığını ancak tek/en son istekle bir sızıntı olmadığını gösteriyor. JQuery kodunun neden bu sorunu göstermediğini hala anlamıyorum, ancak jQuery kodu ... ve benimki gibi ekran görüntülerine dayanarak daha kolay bir şekilde anlamanız daha kolay bir yol olduğunu anlamak güzel olurdu. bir sızıntı ve ne değil. – philfreo

    +4

    Bakış açımdan, yeni bir nesne görünür ve her yineleme/eylemden sonra yığın halinde kalırsa, örneğin 10 kez bir düğmeye bastığımda ve 10 nesne yığın halinde aldığımda, bu bir sızıntıdır. yani, kullanıcı hareketlerinin sayısı ve kullanılan hafıza miktarı arasında en azından doğrusal bir bağımlılık olmalıdır. Durumunuzda javascript motoru sonucu bir nedenle önbelleğe alır ve düğmeye bastığınızda bir daha yayınlar. – loislo

    +0

    Bunu satın alacağım, ancak Chrome'un bir Çöp Toplama çalıştırıldıktan sonra (Anlık Görüntü alınmadan önce gerçekleşmesi gereken) harici bir referans bulunmasa bile Heap Snapshot'ta belleğe depolanan materyalleri bildirdiği yanlış/kafa karıştırıcı görünüyor. . Tekrar tekrar edilebilecek bir eylem olmadıkça, bellek sızıntılarını ayıklamak zor hale getirir. – philfreo

    0

    Belki de bir şeyleri özlüyor, ancak orijinal gönderideki jsfiddle'ler aynı sonuçları döndürüyor mu? Ayrıca

    ,

    $.ajaxSetup({cache : false})

    sonuçlarını etkileyebilir?

    Terminal (* nix) de, krom/krom tarayıcıda tarayıcı önbelleği silmek gerekirse chrome ile chromium değiştirilmesi

    find ~/.cache/chromium/Default/Cache -type f -exec rm -f {} \;

    find ~/.cache/chromium/Default/Media\ Cache -type f -exec rm -f {} \;

    deneyin. Alternatif olarak, cihazın en

    chromium veya chrome klasörüne gidin içindeki her Default ve Media Cache klasörlere gitmek ve içeriğini silin.

    +0

    Anlayabildiğim kadarıyla, "önbellek", http yanıtının önbelleğe kaydedilen başlıkları temelinde ... diskteki http yanıtını önbelleğe alarak tarayıcının önbelleğe alınmış belleğinde olup olmadığına bakmıyor. – philfreo

    +0

    Yukardaki görüldüğü gibi, aynı cevabı türetmek için ortaya çıktığı gibi, yani "X" nin dolgu ekranı, hem jsfiddles jsfiddle.net/HZmT5/2 jsfiddle.net/JmA8v/1? Krom/krom devtools, kullanılan devtools sekmesine bağlı olarak birkaç "katman" "bellek" sağlayabilir. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ V8 motoru optimizasyon için birçok farklı hile kullanır ve kendi iç yapısı ve oluşturulan kod içinde bir nesneye bir başvuru tutabilir. "- loislo_. Şartı nedir? Lütfen açıkla. Teşekkürler – guest271314