Rumah >pembangunan bahagian belakang >C++ >Kenapa koleksi sampah berkelakuan berbeza dalam mod debug berbanding mod pelepasan dalam .net?
.NET Sampah Koleksi: Debug vs. Perbezaan mod pelepasan
mari kita periksa tingkah laku pengumpulan sampah di .net, memberi tumpuan kepada perbezaan antara debug dan pelepasan. Pertimbangkan contoh C# 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 this results in "1" at the Console.WriteLine call. } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Outputs "0" Console.Read(); } }</code>Menjalankan kod ini mungkin menghasilkan hasil yang mengejutkan:
kekal 0, walaupun Class1.c
keluar dari skop dan seolah -olah layak untuk pengumpulan sampah. c1
Mekanisme yang mendasari
percanggahan timbul dari pengoptimuman pengkompil JIT. Dalam mod pelepasan, pengkompil mengoptimumkan kod untuk prestasi, sering membuat jadual untuk mengesan penggunaan berubah -ubah. Ini membolehkan pengumpulan sampah yang cekap.
Dalam contoh kami, debugger menyimpan rujukan kepada
di seluruh, menghalang pemuktsan segera. Oleh itu, output adalah "0," bukan "1." c1
Main()
Perbezaan ini sangat penting. Tingkah laku mod pelepasan berbeza dengan ketara dari mod debug. Jangan sekali -kali bergantung pada masa pengumpulan sampah tertentu dalam kod anda, terutamanya dalam mod debug. Elakkan penyempurnaan objek manual atau tugasan null untuk mengawal pengumpulan sampah. Biarkan runtime menguruskan memori.
Pertimbangan utama:
GC.KeepAlive()
GC.KeepAlive()
Marshal.ReleaseComObject()
Atas ialah kandungan terperinci Kenapa koleksi sampah berkelakuan berbeza dalam mod debug berbanding mod pelepasan dalam .net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!