2009-11-28 10 views
8

'dan sonra bir WeakReference uygulamasına ne olur WeakReference.Target tarafından başvurulan hedef nesne toplandığında, WeakReference ne olur? WeakRerence canlı kalır ve mevcut kalır? Sormamın sebebi, Listede saklanan bir WeakReferences listesi olduğudur. Çalışma zamanı boyunca yeni WeakReferences sürekli olarak bu listeye ekleniyor. Şimdi hedef nesne öldüğünde, terkedilmiş WeakReference'ı kendim temizlemek zorunda mıyım? Eğer öyleyse, bunu nasıl yapabileceğimi akıllıca bir hile var mı? Bir WeakReference terk edildiğinde bildirim alabilir miyim? Veya herhangi bir WeakReference örneğinin bu listeden kaldırılıp kaldırılamayacağını görmek için bu listeden sık sık döngü yapan bir zamanlayıcıyı tanıtmam gerekiyor mu?WeakReference.Target

+0

Bu arada, sorunun anlatımına ilişkin iyi bir iş, problemin ne olduğu konusunda çok net olduğunu hissettim. –

cevap

12

Bu zayıf referanslarla ilgili yaygın bir sorundur. Referansın kendisi hayatta kalır çünkü normal işaretçilere sahiptir. Önerdiğiniz gibi, zaman zaman bazı "manuel çöp toplama" yapmanız gerekir. Listeyi başka bir nedenden ötürü geçtiğinizde muhtemelen yol üzerindeki ipuçlarını temizleyebileceğinizi unutmayın. Listenin kullanım şekline bağlı olarak, bu "yandan" çöp toplama bile yeterli olabilir.

Tek kullanımlık temizlik amacıyla "sık" listeden geçmeyin! Her ölü saplama sadece bir kaç kelime hafızasını harcar. Eğer liste sık kullanılmıyorsa, genellikle temizlik maliyetinin hesaplanması haklı değildir ve sık sık kullanılıyorsa, yukarıda önerildiği gibi kendini temizler.

Başka bir çöp toplama sisteminde tamamen var, ancak sorunları alabilmeniz için this article ile ilgilenmeniz çok benzer.

+0

Listeye endeksle erişilemezse, en iyi ilke, öğeler eklendiğinde, son temizleme ve son koleksiyon arasında eklenen öğelerin sayısı (GC sayaçlarını kullanın) belirli bir sayıyı aşarsa muhtemelen temizlemektir. liste büyüklüğünün oranı. Normalde önemli olan, tüm çöplerin temizlendiği değil, derhal toplanmaya uygun olmayan hurda miktarının sınırlı kaldığıdır. BTW, WeakReferences, "birkaç kelimeden" daha pahalıya mal oluyor. Onlar korkunç derecede pahalı değiller, ama milyonlarca kullanılmayan zayıf ref bir programı bile boğabilirler. – supercat

6

WeakReference nesnesine güçlü bir başvurunuz olduğundan, GC'ed kullanılmayacaktır. Bu ayrıca tasarım gereğidir, çünkü hedefin GC'ed olduğunu öğrenmek için WeakReference'ı kullanmaya devam etmeniz amaçlanmıştır.

Evet, zamanlayıcı yoluna gitmeniz gerekecek.

Eklendi: Ayrıca Garbage Collection Notifications bakmak olabilir.

+1

+1, ancak GC'nin yeni (güzel) özelliklerinden bazılarını devre dışı bıraktıklarından, GC bildirimlerine karşı dikkatli olmalıyım. – user7116

1

Amaçlanan kullanım, WeakReferences ile bir ReferenceQueue kaydettirmenizdir. Hedef toplandığında, referans sıraya eklenir. Sırayı sorgulayabilir veya bekleyebilir ve Listenizden WeakReference nesnelerini kaldırabilirsiniz.

+2

Bu mekanizmanın .NET olduğundan emin misiniz? Bence Java'ya atıfta bulunursun ... – bitbonk

+0

Üzgünüm, biraz etiket körlüğü vardı. Herhangi bir .NET kullanmıyorum, bu yüzden sınıflar tam olarak aynı isimlere sahip olduğunda kafam karıştı. – OrangeDog