Çöp toplayıcıyı çalıştırmak için nasıl zorlanır?


147

Röportajcı bana bugün bunu sordu ... bir cevap var mı?


3
Bu sorunun neden bunu yapmamanız gerektiği konusunda iyi bir bilgisi var: stackoverflow.com/questions/118633/…
Hans Olsson

1
neden böyle söylüyorsun
Andrew Collins

1
@Jason - Belki de görüşmeci çözümü duymak istemiyordu, Andrew'un bilgi ve muhakemesini buna karşı almak istemiyordu, o zaman bu soru etkili olabilirdi.
martinstoeckli

2
@martinstoeckli Hala korkunç bir soru. Stresli bir röportajda bilgisi olan biri, bunun hileli bir soru olduğunu fark etmez veya ek bilgi sağlamayı düşünmez. O zaman soru, görüşmecinin bilgisi olan veya olmayan birisini ayırt etmesine yardımcı olmaz. Yani soru hala korkunç.
James

2
"Ne zaman çöp toplamaya zorlarsınız?" bana güzel bir röportaj sorusu gibi geliyor ("Nasıl": çok değil). Başlangıç: Bilmiyorum. Orta: Asla. Uzman: Bellek sızıntıları için bir test yazdığınızda.
mikebridge

Yanıtlar:


188

System.GC.Collect()çöp toplayıcıyı çalıştırmaya zorlar. Bu önerilmez ancak durumlar ortaya çıkarsa kullanılabilir.


17
Neden önerilmez?
Luke T O'Brien

5
GC.Collect () kullanımı pahalıdır. Gerektiğinden fazlasını yapmak tavsiye edilmez. Ne zaman çağrılması gerektiğine dair kod iyi yazılmıştır. Normalde sadece uzmanlık gerektiren durumlarda kendini toplamanız gerekir. stackoverflow.com/a/21961777/2710988
Brandon Barkley

186

Gc'yi açıkça çağırmanız önerilmez, ancak

GC.Collect();
GC.WaitForPendingFinalizers();

Kodunuz boyunca açıkça GC'yi arayacaktır, GC.WaitForPendingFinalizers();sonra aramayı unutmayın GC.Collect().


14
WaitForPendingFinalizersmutlaka "daha iyi performans" vermez: sonlandırma kuyruğundaki tüm nesneler sonlanıncaya kadar engeller (önceki çağrınız tarafından oraya konmuş olabilecek nesneler Collect). Bu nesnelerin toplanması için bir şans istiyorsanız, aradıktan sonra başka bir çağrı yapmanız gerekir . Collect WaitForPendingFinalizers
LukeH

2
Gc.Collect'i aramak için birkaç iyi nedenden biri, uygun şekilde atılmamış kaynakları boşaltmak için son bir çaba olduğundan, WaitForPendingFinalizers gerekli bir adım gibi görünecektir. Yine de, bu gibi durumlarda gc.Collect'i çağırmaktan kaçınmak için en iyi uygulamanın ne olacağından emin değilim. BTW, gc.Collect'in nesiller için 'sahip olduğu' herhangi bir teknik neden olup olmadığını merak ediyorum. İlerlemeyi haklı çıkarmak için bir şey yeterli miktarda tahsis edilmedikçe, nesillerin kalmasını sağlamak daha yararlı görünecektir.
Supercat

2
C # (benim gibi) yeni başlayanlar için not : GC zorlama çağrısı garanti etmez, bazı somut kullanılmayan nesneler bellekten kaldırılır. (bunu yapmanın bir yolu "using deyimi" kullanmaktır ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567

Aramak neden önemlidir WaitForPendingFinalizers?
Christian

19
GC.Collect() 

dan MDSN ,

Erişilemeyen tüm belleği geri almaya çalışmak için bu yöntemi kullanın.

Hafızada ne kadar süre kaldıklarına bakılmaksızın tüm nesneler toplama için dikkate alınır; ancak, yönetilen kodda başvurulan nesneler toplanmaz. Sistemi, kullanılabilir maksimum bellek miktarını geri almaya çalışmak için bu yöntemi kullanın.



12

GC.Collect();

Bununla birlikte, Çöp Toplayıcı'nın beklediğiniz şeyi her zaman temizlemeyebileceğini unutmayın ...


5
Bununla ne demek istiyorsun? Beklenmedik bir şekilde ne temiz olabilir?
Voldemort

5
@Voldemort - Beklenmedik bir şey temizlemez. Ancak beklediğiniz her şeyi temizlemeyebilir.
Justin Niessner

6

Çöp toplayıcıyı çalışmaya zorlamak istemezsiniz.

Ancak, daha önce (tamamen akademik bir alıştırma olarak) yaptıysanız:

GC.Collect()

4
@ Karthik'in cevabını tercih ederim, bir uygulamanın yasal olarak GC.Collect () öğesini çağırması gereken durumlar olabilir. Çok nadiren de olsa.
Henk Holterman

2
Bir dizi zayıf referansınız olduğunu ve herhangi bir 'canlı' referans olup olmadığını kontrol etmek istediğinizi varsayalım. Kontrol etmeden önce GC.Collect () öğesini çağırmak mantıklı olacaktır. Sadece söylüyorum.
Zengin Ehmer

1
Açılış ifadesi aslında yanlış olduğu için indirildi; Evet, çöp toplayıcıyı çalışmaya zorlamak istiyorum.
Syndog

5

Net Framework bunu otomatik olarak yapar, ancak her ihtimale karşı. İlk olarak, silmek istediğinizi seçtiğinizden emin olun ve ardından çöp toplayıcıyı arayın:

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

Sanırım bu .. Umarım birine yardım ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.