Soru Bir döngü içinde GC.Collect?


Reflektör kullanarak System.Web.ISAPIRuntime içindeki kod parçasını buldum

public void DoGCCollect()
{
    for (int i = 10; i > 0; i--)
    {
        GC.Collect();
    }
}

Bu konuda yorum yapan var mı? Bir döngüde GC.Collect () yapmak için bir neden var mı? Neden 10 kez değil 3, 5 veya 20 mi? Analiz, .net framework'ünün içinde kullanılmadığını, ancak kamuya açık olduğunu, bu yüzden IIS'nin bunu arayabileceğini ...

Düzenle :

Sadece açıklama amacıyla: GC.Collect'i hiç kullanmadım ve kullanma niyetim yok. Çoğu (tüm olmasa bile) vakalarda kötü bir fikir olduğunu biliyorum. Sorunun nedeni. Net framework bunu yapar. Bütün cevapların için teşekkürler.


21
2018-03-17 11:15


Menşei


Bu kod nereden aranır? (Sadece bazı birim testlerinin bir parçası olarak kullanılabilir.) - Ian Ringrose


Cevaplar:


Daha iyi bir açıklama alacağınızı düşünmüyorum, "Microsoft'un programcılarından biri oldukça clueless ve görünüşe bakılırsa, hiç kimse kontrol edilmeden önce koduna bakmaktan rahatsızlık duymadı". ;)

Yine de korkutucu görünüyor.

Anlamadığınız böceklere oldukça yaygın bir cevap. Her ne sebeple olursa olsun, GC'yi aramaya çalışıyorsunuz ve bir şekilde, onu çağırmak sorununuzu çözmüyor gibi görünüyor (belki de asıl sorun sadece finalizör ipliği veya bir şey için beklemeniz gerektiğiydi), bu yüzden naif çözüm Belli ki "Eh, sadece onu aramaya devam edeceğim".

Belgeniz yazdırılana kadar art arda 'yazdırmaya' benzer.

Belki de, thedailywtf.com adresine göndermelisiniz.


5
2018-03-17 11:04





Evet, bu korkunç. Öncelikle, bunu hiç yapmanıza gerek yok. Ancak, çöp toplama işlemini olabildiğince sert bir şekilde zorlamak istiyorsanız ve bunu bitirmesini beklemek istiyorsanız, muhtemelen şunları kullanmalısınız:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
// Collect anything that's just been finalized
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

Gerçekten de iyi bir fikir değil.


14
2018-03-17 10:57



Ben hiç kullanmıyorum, aslında benim uygulamalarında GC.Collect () kullanmamıştım ve neden bu kodun .net çerçevesinde var olduğunu anlayamıyorum - Diadistis
Eek - Bunun .NET çerçevesinin kendisinin bir parçası olduğunu fark etmemiştim. Bu daha da iğrenç. Ah iyi. - Jon Skeet
Bu arada, kesinlikle garanti ulaşılamaz tüm nesnelerin imha edileceği? GC'nin farklı uygulamalarının, toplama maliyetini eksiksiz hale getirmek için buluşsal yöntemleri kullanma özgürlüğüne sahip olduğu izlenimine kapıldım. - Konrad Rudolph
@Konrad: "Optimized" yerine "Forced" kullanıldığında, GC'yi itmeye istekli olduğu kadar itecek, inanıyorum. Her şeyi temizlemenin kesinlikle garanti edilip edilmediğini bilmiyorum, ama yapabileceğiniz kadar yakın. - Jon Skeet
@PraveenKumar: Çağrı GC.Collect hiç de nadiren çözmek için doğru yol OutOfMemoryException - şansın olmadığın referansları tutuyorsun. Ne olduğunu öğrenmek için bir profiler kullanın. - Jon Skeet


Gerçekten korkunç görünüyor :)


7
2018-03-17 10:58



lol, bu benim de ilk düşüncem ve birisinin bana yanlış olduğunu kanıtlayacağını umuyordum: P - Diadistis
Office araç çubukları ile birlikte, imo, sistemdeki en kötü isim alanı olan System.Web'in fırçasında kararlıdır. - Chris S
System.Web ekibinin gerçek .NET framework çekirdek ekibi ile çok zayıf bir işbirliği vardı. - Patrick Peters


Bu yöntemin Mono uygulamasını gerçekten çok beğendim:

public void DoGCCollect ()
{
  // Do nothing.
}

Muhtemelen geliştirici benzer bir şey yazmayı amaçlamıştır ve bu sadece bir yazım hatasıdır.


2
2018-03-17 11:00





Bir kıyamet kompleksi olan biri, 10 saniyelik bir zamanlayıcıyla dünyayı bitirecekleri çağrışımlarla yazdı.


1
2018-03-17 11:08





Bunun gibi şeyler Microsoft'a işaret edilmemeli mi? Bunu Connect sitesinde yayınlamak iyi olur mu?


1





Bu iyi bir fikir değildir, çünkü özellikle de kollektörünüzün işini yapmak için çöp toplayıcısına gerçekten güvenmeniz gerekir.

Zamanın% 99,9'u, GC’yi kodunuzdan aramanıza gerek yoktur.


0



Daha fazla katılıyorum, bu yüzden bu kodun .net çerçevesinin içinde yaptıklarını anlayamıyorum - Diadistis
Whoa - Bulduğun yeri söylediğin yeri görmedim! Olmadı! - Andrew Hare


Her şeyden önce aramak iyi bir fikir değil GC.Collect(). Birden çok kez çağırmak çok az etkiye sahiptir.

Ancak, bazen arama modelini görürsünüz Collect(), sonra WaitForPendingFinalizers()ve son olarak Collect() tekrar. Bunun arkasındaki fikir, ilk tahsilattan kurtulacakları gibi, finalleştirici örneklerinin de geri kazanılmasını sağlamaktır. Bunun uygulamada bir gecikmeye neden olacağını ve bunun çok nadiren gerekli


0