.net Collection Collection: A Debug vs. Release Conundrum
Artikel ini meneroka. Pertimbangkan kod ini:
<code class="language-csharp">public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1 = new Class1(); //c1 = null; // Uncommenting doesn't significantly change release behavior } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Prints 0 in debug, 1 in release Console.Read(); } }</code>
tidak ada skop, namun finalisasinya tidak berjalan dalam mod debug. c1
Pengaruh debugger
Kunci terletak pada interaksi debugger dengan pengkompil .NET JIT. Semasa debugging, JIT mengubah jadual dalaman yang mengesan jangka hayat pembolehubah tempatan. Pengubahsuaian ini memanjangkan seumur hidup pembolehubah tempatan, yang membolehkan anda memeriksa mereka walaupun selepas mereka keluar dari skop. Ini menghalang pengumpulan sampah pramatang semasa debugging.
pelepasan tingkah laku binaan
menjalankan kod dalam binaan pelepasan (tanpa pengoptimuman JIT) mendedahkan tingkah laku yang diharapkan. dimuktamadkan, c1
kenaikan, dan output konsol "1". Class1.c
koleksi sampah tanpa debugger
Tanpa debugger, pemungut sampah dengan cekap menuntut semula memori. Walaupun kaedah yang mengandungi rujukan masih berjalan, objek itu layak untuk pengumpulan jika kaedah itu tidak lagi merujuk secara langsung. Ini menghalang kebocoran memori.
garis c1 = null;
to c1
tidak banyak mengubah hasil binaan pelepasan. Pengoptimal JIT mungkin menghilangkan garis ini kerana ia berfungsi secara berlebihan. null
Kesimpulan
Perbezaan dalam tingkah laku pengumpulan sampah antara debug dan pelepasan membina batang dari pengaruh debugger pada pengkompil JIT. Sentiasa menguji kod yang berkaitan dengan pengumpulan sampah dalam pembinaan pelepasan untuk memastikan hasil yang tepat dalam persekitaran pengeluaran. Memahami perbezaan ini adalah penting untuk mengelakkan tingkah laku yang tidak dijangka dan isu memori yang berpotensi.Atas ialah kandungan terperinci Kenapa tidak koleksi sampah memuktamadkan objek saya dalam membina debug, tetapi adakah dalam binaan pelepasan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!