Bagaimana cara memaksa pengumpul sampah untuk menjalankan?


147

Pewawancara bertanya kepada saya tentang hal ini hari ini ... apakah ada jawaban?


3
Pertanyaan ini memiliki info bagus tentang mengapa Anda tidak harus melakukan itu: stackoverflow.com/questions/118633/...
Hans Olsson

1
mengapa kamu mengatakan seperti ini
Andrew Collins

1
@Jason - Mungkin pewawancara tidak ingin mendengar solusinya, alih-alih mendapatkan pengetahuan dan alasan Andrew untuk tidak melakukannya, maka pertanyaan ini secara efektif bisa masuk akal.
martinstoeckli

2
@martinstoeckli Masih merupakan pertanyaan yang mengerikan. Seseorang dengan pengetahuan dalam wawancara yang penuh tekanan tidak akan menyadari bahwa itu adalah pertanyaan jebakan, atau berpikir untuk memberikan info tambahan. Maka pertanyaan itu tidak membantu pewawancara membedakan antara seseorang dengan pengetahuan atau seseorang tanpa itu. Jadi pertanyaannya masih mengerikan.
James

2
"Kapan kamu memaksakan pengumpulan sampah?" kedengarannya seperti pertanyaan wawancara yang baik bagi saya ("Bagaimana": tidak begitu banyak). Pemula: Saya tidak tahu. Menengah: Tidak pernah. Pakar: Saat Anda menulis tes kebocoran memori.
mikebridge

Jawaban:


188

System.GC.Collect()memaksa pengumpul sampah untuk berlari. Ini tidak direkomendasikan tetapi dapat digunakan jika situasi muncul.


17
Kenapa tidak direkomendasikan?
Luke T O'Brien

5
GC.Collect () mahal untuk dijalankan. Melakukannya lebih dari yang diperlukan tidak disarankan. Kode kapan harus dipanggil ditulis dengan baik. Anda biasanya hanya mengumpulkan sendiri dalam kasus tepi khusus. stackoverflow.com/a/21961777/2710988
Brandon Barkley

186

Tidak disarankan untuk memanggil gc secara eksplisit, tetapi jika Anda menelepon

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

Itu akan memanggil GC secara eksplisit di seluruh kode Anda, jangan lupa untuk menelepon GC.WaitForPendingFinalizers();setelah GC.Collect().


14
WaitForPendingFinalizerstidak selalu memberikan "kinerja yang lebih baik": itu hanya memblokir sampai semua objek dalam antrian finalisasi telah selesai (objek yang mungkin telah diletakkan di sana oleh panggilan Anda sebelumnya Collect). Jika Anda ingin kesempatan untuk benda-benda itu dikumpulkan maka Anda perlu panggilan lain Collect setelah menelepon WaitForPendingFinalizers.
LukeH

2
Karena salah satu dari beberapa alasan bagus untuk memanggil gc.Collect adalah sebagai upaya terakhir untuk membebaskan sumber daya yang tidak dibuang dengan benar, WaitForPendingFinalizers tampaknya merupakan langkah yang perlu. Namun, tidak yakin apa praktik terbaik untuk menghindari menelepon gc.Kumpulkan secara berlebihan dalam kasus-kasus seperti itu. BTW, saya bertanya-tanya apakah ada alasan teknis yang gc.Collect 'harus' untuk mempromosikan generasi? Tampaknya akan lebih bermanfaat untuk memiliki generasi tetap di tempat kecuali ada cukup banyak barang yang dialokasikan dalam satu untuk membenarkan memajukannya.
supercat

2
Catatan untuk pemula di C # (seperti saya): Panggilan kekuatan GC tidak menjamin, beberapa objek konkret yang tidak digunakan dihapus dari memori. (salah satu cara untuk melakukan ini adalah menggunakan "using statement" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567

Mengapa penting untuk menelepon WaitForPendingFinalizers?
Christian

19
GC.Collect() 

dari MDSN ,

Gunakan metode ini untuk mencoba mendapatkan kembali semua memori yang tidak dapat diakses.

Semua objek, terlepas dari berapa lama mereka berada dalam memori, dipertimbangkan untuk koleksi; namun, objek yang direferensikan dalam kode terkelola tidak dikumpulkan. Gunakan metode ini untuk memaksa sistem untuk mencoba mendapatkan kembali jumlah maksimum memori yang tersedia.



12

GC.Collect();

Perlu diingat, bahwa Pengumpul Sampah mungkin tidak selalu membersihkan apa yang Anda harapkan ...


5
Bagaimana apanya? Apa yang bisa tiba-tiba dibersihkan?
Voldemort

5
@Oldemort - Ini tidak terduga membersihkan apa pun. Tapi itu mungkin tidak membersihkan semua yang Anda harapkan.
Justin Niessner

6

Anda tidak ingin memaksa pengumpul sampah untuk menjalankan.

Namun, jika Anda pernah melakukannya (sebagai latihan murni akademis, tentu saja):

GC.Collect()

4
Saya lebih suka jawaban @ Karthik, mungkin ada situasi di mana aplikasi harus secara sah memanggil GC.Collect (). Sangat jarang.
Henk Holterman

2
Katakanlah Anda memiliki serangkaian referensi yang lemah dan ingin memeriksa apakah ada referensi 'langsung'. Masuk akal untuk menelepon GC.Collect () sebelum memeriksa. Hanya mengatakan.
Rich Ehmer

1
Turun karena pernyataan pembukaan secara faktual salah; Ya, saya ingin memaksa pengumpul sampah untuk menjalankan.
Syndog

5

Saya pikir .Net Framework melakukan ini secara otomatis tetapi untuk berjaga-jaga. Pertama, pastikan untuk memilih apa yang ingin Anda hapus, dan kemudian memanggil pemulung:

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();

Saya pikir itu saja .. Semoga saya bisa membantu seseorang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.