[英]garbage collection not working int .net c#
我以這段代碼為例:
var p = new person("Amir");
var zp = new person("Amiraa");
GC.Collect();
GC.WaitForPendingFinalizers();
class person
{
public person(string nName)
{
Console.WriteLine("New");
string name = nName;
}
~person()
{
Console.WriteLine("Garbage collected");
}
}
但是控制台上的結果只顯示“新”,而不是“垃圾收集”。 那么為什么 gc 不工作呢?
試一試,您會注意到您的代碼在Release中按預期工作,但不一定在Debug中工作。
這是因為變量p
和zp
在您調用GC.Collect()
時仍在 scope 中。 它們仍然引用person
實例。
在 Release 中,GC 會很高興地收集仍然在 scope 中的變量引用的對象,只要它們不再被使用。 在Debug中,調試器需要讓你查看scope中所有變量的內容,所以GC無法收集。
如果你這樣做:
var p = new person("Amir");
var zp = new person("Amiraa");
p = null;
zp = null;
GC.Collect();
GC.WaitForPendingFinalizers();
即使在調試中,您也會看到您期望的 output 。 請注意,.NET 6 中引入的分層編譯會影響這一點,上述測試可能無法按預期工作。
如果您引入一個單獨的方法,因此p
和zp
的生命周期是明確限定的,那么即使在.NET 6 的 Debug 中,您也應該看到預期的行為:
Test();
GC.Collect();
GC.WaitForPendingFinalizers();
void Test()
{
var p = new person("Amir");
var zp = new person("Amiraa");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.