SORU
15 Mart 2010, PAZARTESİ


Neden bir WordPress kullanmak çok kötü bir bellek sızıntısı?

Bu bir takip soru geçen hafta yayınlanan bir tür: http://stackoverflow.com/questions/2429056/simple-jquery-ajax-call-leaks-memory-in-ie

Jquery sözdizimi ve güzel onun tüm özelliklerini seviyorum, ama otomatik olarak ajax ile güncellemeleri tablo hücreleri bellek sızıntı çağıran bir sayfa ile sorun yaşıyorum.

Deneme için iki basit test sayfaları yarattım. Her iki sayfa bir ajax çağrısı, .1 saniye. Her başarılı ajax çağrısından sonra, bir sayaç artırılır ve DOM güncellenir. Senaryoyu sonra 1000 devir vermiyor.

Bir de ajax çağrısı için jquery ve DOM güncelleştirmek için kullanır. Diğer ajax Yahoo API kullanır ve bir belge yok.(...) getelementbyıd.innerHTML DOM güncelleştirme için.

Jquery sürümü, bellek sızdırıyor kötü. Damla (XP üzerinde IE 7 ile Eve) çalışan, 9 MB başlayan ve büyüyen 48 MB hafıza ile yaklaşık doğrusal olarak bütün zaman tamamlanır. Ben güncellemeleri DOM bu açıklama, hala 32 MB, hatta basit DOM güncellemeleri, önemli miktarda bellek sızıntısı olduğuna dair bitirir. Non-jquery sürümü ve 9 MB, DOM güncellemeleri bakılmaksızın hakkında başlıyor ve bitiyor.

Herkes bir WordPress kullanmak çok kötü sızıntı neden iyi bir açıklama var mı? Eksik bir şey belli mi? Farkında değilim döngüsel bir başvuru var mı? Ya da bir WordPress kullanmak sadece ciddi hafıza sorunları var mı?

Burada (jquery) sızdıran sürümü için kaynak:

<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load('jquery', '1.4.2');
    </script>
    <script type="text/javascript">
      var counter = 0;
      leakTest();
      function leakTest() {
        $.ajax({ url: '/html/delme.x',
                 type: 'GET',
                 success: incrementCounter
               });
      }
      function incrementCounter(data) {
        if (counter<1000) {
          counter  ;
          $('#counter').text(counter);
          setTimeout(leakTest,100);
        }
        else $('#counter').text('finished.');
      }
    </script>
  </head>
  <body>
    <div>Why is memory usage going up?</div>
    <div id="counter"></div>
  </body>
</html>

Ve burada olmayan sızdıran sürümü:

<html>
  <head>
    <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo-min.js"></script>
    <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/event/event-min.js"></script>
    <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection_core-min.js"></script>
    <script type="text/javascript">
      var counter = 0;
      leakTest();
      function leakTest() {
        YAHOO.util.Connect.asyncRequest('GET',
                                        '/html/delme.x',
                                        {success:incrementCounter});
      }
      function incrementCounter(o) {
        if (counter<1000) {
          counter  ;
          document.getElementById('counter').innerHTML = counter;
          setTimeout(leakTest,100);
        }
        else document.getElementById('counter').innerHTML = 'finished.'
      }
    </script>
  </head>
  <body>
    <div>Memory usage is stable, right?</div>
    <div id="counter"></div>
  </body>
</html>

CEVAP
29 Mart 2011, Salı


Benim ilk düşünce yolu ile jquery ajax yöntemi de ilgisi olabilir:

bir. döngüsel başvurular, IE için özellikle kötü oluşturur

b. oluşturur yaratılmıştır ve DontDelete özelliği ayarı nedeniyle silinemez iç nesnelerin özelliklerini. Daha fazla bilgi için bkz: http://perfectionkills.com/understanding-delete/

Her iki şekilde de, çöp toplayıcı, özellikle eğer şüpheli işlevi sık yürütülüyorsa kaçak bir bellek sızıntısı neden olur, çöp toplamaktan başka engel olur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • Dion Coulls

    Dion Coulls

    16 AĞUSTOS 2006
  • Fraser Raft

    Fraser Raft

    9 Mart 2010