MyClass'ın bir örneğinin başka bir yoldan kaynaklanmadığını varsayarsak, buradaki özel statik referans, çöpün toplanmasını engeller mi?Statik alanda kendini referans alan bir sınıf çöp toplayabilir mi?
cevap
Gönderdiğiniz sınıf çöp toplanmayacak. çıkış olacaktır
public class MyClass
{
private static MyClass heldInstance;
public MyClass()
{
heldInstance = this;
}
~MyClass()
{
Console.WriteLine("Finalizer called");
}
}
class Program
{
static void Main(string[] args)
{
var x = new MyClass(); // object created
x = null; // object may be eliglible for garbage collection now
// theoretically, a GC could happen here, but probably not, with this little memory used
System.Threading.Thread.Sleep(5000);
// so we force a GC. Now all eligible objects will definitely be collected
GC.Collect(2,GCCollectionMode.Forced);
//however their finalizers will execute in a separate thread, so we wait for them to finish
GC.WaitForPendingFinalizers();
System.Threading.Thread.Sleep(5000);
Console.WriteLine("END");
}
}
: Bir konsol çıkışı ile bunu bir finalizer vererek bu test edebilirsiniz sınıf yalnızca, uygulamanın nihai devrelerde değil toplanan alır demektir
END
Finalizer called
düzenli çöp toplama sırasında.
böyle bu sınıfın birden çok örneğini oluşturursanız:
var x = new MyClass();
x = new MyClass();
x = new MyClass();
x = new MyClass();
sonra en son bir çöp toplanacak bütün hariç.
Sen Çöp toplayıcı nesneleri ulaşılabilir ve olmayanlar da toplayacaktır belirler
Finalizer called
Finalizer called
Finalizer called
END
Finalizer called
Bunun yalnızca 'heldInstance' statik olduğu için geçerli olduğunu unutmayın. MyClass' 'örneğidir kendisine bir başvuru olmadığı gerçeğine özel bir şey yoktur. Yani, evet "kendisine referans veren bir sınıf" çöp toplanabilir. Ancak, örnekte sınıf olamaz. – dgvid
tanınacak. Bir nesnenin ulaşılabilir olup olmadığını belirlemek için, toplayıcı kökleri ile başlayacaktır. Kökler arasında şu anda değerlendirme yığında olan şeyler var, ancak statik alanlar. Kollektör, nesnelere, köklerden herhangi bir nesneye ve böyle bir nesneden başka bir nesneye ve benzerlerine yapılan referansları takip edecektir. Bu şekilde ziyaret edilen her bir nesneye ulaşılabilir ve bu nedenle canlı tutulur.
Sizin durumunuzda statik alan çöp toplayıcısının köklerinden biridir ve bu nedenle bu alan tarafından (dolaylı olarak) başvurulan herhangi bir nesneyi asla toplamaz. Ancak, alanı null
olarak ayarlarsanız, o alan artık örneğe başvurmaz ve örneği toplanabilir. [? Statik üyeler hiç çöp toplanan alır mıyım] arasında
- 1. Sınıf kendini mi uzatıyor?
- 2. Bu kendi kendini referans alan Jenerik görevlendirmesi neden yasa dışı?
- 3. Statik bir final Nesne, Çöp Toplayıcı tarafından silindi mi?
- 4. Statik üyelerin çöp toplama
- 5. PHP kendini değiştirmek :: statik Can ::?
- 6. iç referans çöp toplanmasını önler
- 7. Sınıf alanı (statik alan) Delphi içinde
- 8. Kendi kendini referans alan bir klasör hiyerarşisini eşleştirmek için Fluent NHibernate'i nasıl kullanırım?
- 9. Şekilsiz: vaka sınıf veya alanda
- 10. Java "self" (statik) referans
- 11. Hızlı, sınıf düzeyi statik değişkenlere sahip mi?
- 12. Bir alan adı başka bir alanda barındırılan bir sayfayı getiriyor
- 13. Bir birlik konteyneri, bir yapıcı parametresi olarak kendini referans verebilir mi?
- 14. Statik sınıf AppContext kullanmak iyi bir fikir mi?
- 15. C# statik alan, örnek yapıcı
- 16. Web Servisi bir referans eklemeden mi?
- 17. Soyut sınıf için referans
- 18. Java generized sınıf referans
- 19. Statik olmayan bir alandan statik alan referansı alınamıyor
- 20. işaretçiyi referans alan işleve geçirme?
- 21. Çok-alanlı alan kendini nasıl kullanır?
- 22. Tek bir alanda birden çok alan değeri göstermeFotoğraf
- 23. Sayısal alan taşması - hangi alanda tam olarak? Bir hata durumunda
- 24. Mysql dizeleri toplayabilir misiniz?
- 25. Bir nesneyi yayımlama bağlamında bağlamı (this) mi? Kendini iyi mi?
- 26. C# de yardımcı yöntemler: Statik mi yoksa statik olmayan mı?
- 27. Access Query'de başka bir alanda yer alan bir alan adı nasıl değerlendirilir?
- 28. ConfigurationManager ve Statik Sınıf
- 29. sınıf statik üye değişkenler
- 30. Python'da statik iç sınıf
olası yinelenen (http://stackoverflow.com/questions/6600093/do-static-members-ever-get-garbage-collected) DÜZENLEME: Kısacası, hayır, Yapacağına inanmıyorum. Örneğin, deftere kodu, (heldInstance == null), _instances_ olduğu tek bekletilen referanslar kendisine kendisinden Bunun dışında 'vardır toplanacak _eventually_ eğer kamu yapıcı' vardı olamazdı hiçbir neden yoktur GC tarafından, artık erişilebilir olmadığını belirlediğinde. –
Evet, AppDomain kaldırılmadan hemen önce toplanıyorlar. Sınıf bir finalizer olmadıkça bu tutarsızdır. –
Sınıfın statik alanının, aynı sınıfın * bir örneğine başvurması gerçeği alakasız. Statik alanlar köklerdir; türüne bakılmaksızın onlara koyduğunuz bir şeyi canlı tutacaktır. –