2009-10-05 19 views
22

Javascript'in çöp toplayıcı olduğunu biliyorum. Bunun için, delete delete nesnesine yalnızca bir referansı kaldırır ve bu nesneye daha fazla referans olmadığında, GC tarafından silinir.Javascript bellek yönetimi tuzaklar?

Javascript, kapaklar, bulanık isim alanı ve prototip mirasıyla birlikte zor, şimdi ne zaman veya neden olduğunu bilmek her zaman açık değildir.

Oldukça geniş bir Javascript projesi kodluyorum ve bellek kullanımını engellemek isterken, bellek kullanımını engellemek istiyorum. Optimizasyon aşamasında hiç de değilim (ilk önce işleri halletelim :-)), ancak bu yazım hatalarını önlemek için bellek yönetimi için iyi uygulamaları bilmek güzel olurdu.

  • numaralı telefonu nasıl kullanmalıyım?
  • Kaçınılması gereken tuzaklar nelerdir? Nesneleri kullanarak?
  • Kapatmalarla ilgili bazı şeyler bilmek ister misiniz?
  • Vurgulanacak bazı iyi uygulamalar?
+0

Belki de ** şimdi ** veya neden 'ne zaman bilmeniz gereken bir yazım hatası olabilir mi? Bu biraz İngilizceyi ayrıştıramıyorum ... – hippietrail

+0

Kendimi anlayamıyorum. Belki sarhoştum ya da yazdığımda uyandım. Ya da her ikisi de. Görmezden gel. –

cevap

3

DOM düğümlerindeki verileri depolayarak, tüm tarayıcıların ele alınamayacağı kolayca döngüsel başvurular oluşturabileceğinizi düşünüyorum. Örneğin: Eğer takılı bir olay dinleyicisi olsaydı removeChild kullanılarak kaldırıldı sonra IE'de

this.element = document.getElementById('something'); 
this.element.attachedObject = this; 
5
  • , en azından eski sürümlerinde, bir DOM öğesi hafızada tutuldu. Bunu bellekten kaldırmanın tek yolu, etkinliği DOM'den kaldırmadan önce çıkarmaktı.
  • Öğeleri sık sık oluşturmaz ve kaldırmazsanız, bunun için endişelenmenize gerek yoktur. Uygulama başladığında çok sayıda öğe oluşturursanız, ancak bundan sonra yeni nesneler oluşturmazsanız, bellek sızıntıları hakkında çok fazla endişelenmeyin.
10

Deneyimlerimden, Çöp Toplayıcıları tarayıcıya bağlı olarak iyi/kötü şekilde uygulandı. Nesne yönelimli programlama uygulamalarını uygulamak iyi bir başlangıç.

Benim tek tavsiye

: (DOM ve JS GCler tarafından temizlenmez dairesel başvurular) nesneleri JavaScript DOM & bağlayarak bellek sızıntılarını oluşturmaz. Bu hatalar, uygulamanızın içinde yer alacağınız herhangi bir nesneden çok daha fazla hafıza içerecektir.

DOM/JS bellek sızıntılarıyla ilgili daha fazla ayrıntı. http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+1

Js nesneleriyle DOM bağlanması konusunda katılıyorum, benim bildiğim en büyük sorundur. Çoğu tarayıcının sırasıyla DOM ve js nesneleri için farklı bellek yığını olduğunu düşünüyorum, bu nedenle aralarında bağlantı yapmak genellikle bellek sızıntılarına neden oluyor. Başka bir yararlı bağlantı: http://www.ibm.com/developerworks/web/library/wa-memleak/ – Vojta