簡體   English   中英

垃圾收集不起作用 int .net c#

[英]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中工作。

這是因為變量pzp在您調用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 中引入的分層編譯會影響這一點,上述測試可能無法按預期工作。

如果您引入一個單獨的方法,因此pzp的生命周期是明確限定的,那么即使在.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM