2013-09-27 14 views
5

Ben jQuery UI sürüklenebilir kitaplığında bir bellek sızıntısı keşfettim düşünüyorum, sorun Meteor neden olmasına rağmen, emin değilim.jQuery UI'de bellek sızıntısı MeteorJS ile sürüklenebilir mi?

Uygulamam ilk kez bir grup kullanıcı tarafından ilk kez kullanıldığında bunu fark ettim. Uygulamayı bir sekmede açtım ve günün sonunda çok yavaştı, kullanılamazdı. Bellek kullanımını kontrol ettim ve neredeyse bir GB bellek kullandığını fark ettim.

Bu sorunu yeniden oluşturmak için, uygulamada oturum açan ve Chrome'un dev araçlarındaki bellek kullanımını kaydederken bir sürü güncelleme gerçekleştiren bir PhantomJS komut dosyası yazdım. Bu yüzden, hangi kodun soruna neden olduğuna bakmaya gittim, şablonumun render olayında elemanlar üzerine sürdüğüm sürüklenebilir/düşünülebilir olaylar olduğunu öğrendim. enter image description here

ve burada sürüklenebilir olmadan benim bellek kullanımıdır: enter image description here

NOT: my fantom komut sürüklenebilir ile çalışır sürerken burada

bellek kullanımı bir örnek ben olarak birlikte droppable sürüklenebilir & çalıştı ZERO konfigürasyon seçenekleri ile ayrı ayrı, ve sızıntıda gözle görülür bir değişiklik bulunmadı.

İlk grafikten de anlaşılacağı gibi, komut dosyası çalışmayı durdurduktan sonra bellek kullanımı yayınlanmıyor (yaklaşık 1.4 dakika) ve bellek kullanımında oldukça iyi bir artış var (14,3 MB ila 169 MB). Bu, yaklaşık 300-500 güncellemeyi çalıştırıyor (muhtemelen pek de çok sayıda kullanıcıyla bütün bir gün boyunca, tüm bu gerçekçi olmayan şeyler).

Burada anahtarın, Chrome'un zaman çizelgesi sekmesinde size verdiği düğüm sayısı olduğunu düşünüyorum. Komut çalıştırıldıktan sonra DOM Node Count'a göre 100 000+ DOM düğümleri var, ikincisi 1000 civarında.

Bu sorunun gerçek olmasını sağlamak için tamamen bağımsız bir proje oluşturdum. Bunu herkesin oynaması için github'a koydum. PhantomJS komutum kök dizinde.

https://github.com/davidworkman9/jQueryDraggableMemLeakWithMeteor

Ben sorunu bu paketlerin birinden bir düzeltme olmadan çözülebilir ise Meteor veya jQuery UI veya verilip, buradan nereye emin değilim.

+0

İlişkili olmamakla birlikte, bana http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html –

+0

'u hatırlatıyor. Bunu da gördüm, bu sızıntının kapanmalarla ilgili olduğu anlaşılıyor Burada olup bitenler (bence), şablon yeniden çizilirken DOM düğümlerinin temizlenmemesidir. – Dave

cevap

0

Bu sorundan muzdarip herkes için geçici bir düzeltme tasarladım (bu, her şablonun yeniden oluşturulmasını sağlar). Google Grupları forumunda Meteor Çekirdek geliştiricilerin

(function() { 
    var oldRender = Spark.renderToRange; 
    Spark.renderToRange = function (range, htmlFunc) { 
     var oldFunc = htmlFunc; 
     htmlFunc = function() { 

      // put in clean up code here Example: 
      if(range._start === $('#myTemplate')[0]) { 
       $('#myTemplate').find('.ui-draggable').draggable('destroy'); 
      } 
      // end clean up code 

      return oldFunc.apply(this, arguments); 
     }; 
     return oldRender.apply(this, arguments); 
    }; 
})(); 

biri de çiftleşmiş paketi yazma-re ve bu bu sorunu gidermek amacıyla bana (link) bildirdi.