簡體   English   中英

對於在C#/ VB.NET中具有靜態方法的類,如何進行垃圾收集?

[英]How does Garbage collection happen for Classes having static methods in C#/VB.NET?

將對象設置為null會使GC標記為GC嗎?

編輯:一個類有多個靜態方法。 在程序中使用這些方法時,確保在某個點之后將對象標記為GC的最佳方法是什么?

方法根本不是垃圾收集 - 所以你的問題意味着什么並不是很清楚。

同樣,您永遠不會將對象設置為null。 您可以將變量的值設為null,但這對於變量先前引用的任何對象都不起作用。 它只是意味着下次垃圾收集器查找活動對象時,該變量不會將任何對象提供給必須在GC結束時保持活動狀態的對象集。

我建議您閱讀Jeffrey Richter關於垃圾收集的文章,了解更多背景信息,然后在掌握基礎知識時再詢問任何進一步的具體問題。

如果您詢問靜態方法中變量引用的對象會發生什么變化,那么當這些對象不再在范圍內時,這些對象變得可以進行垃圾收集。

如果您正在討論靜態字段引用的對象,那么簡單來說,在將引用設置為null之前,不會收集這些對象。

以下示例可以更好地說明這一點:

class Example
{
    private static object field1 = new object();

    public static void SomeMethod()
    {
        object variable1 = new object();

        // ...
    }

    public static void Deref()
    {
        field1 = null;
    }
}

field1引用的對象將在加載類時創建,並且即使在創建和銷毀類Example的對象時也將保持root。 收集該對象垃圾的唯一方法是調用Deref()方法,該方法通過將引用設置為null來取消引用它。 (實際上,可以通過卸載應用程序域來卸載類,但這有點更高級,而不是經常遇到的問題。)

相反,靜態方法SomeMethod()創建一個對象並通過變量variable1引用它。 一旦超出范圍(在方法結束時),該對象就可以進行垃圾收集。 實際上,如果方法的其余部分沒有引用它,則可以更早地收集它。

對象沒有標記 GC,它們被標記(通過引用或指向它們的變量的存在) 被收集垃圾。 當所有正在運行的線程,所有全局靜態變量以及所有cpu寄存器中的對象的每個變量或引用都被刪除,超出范圍或被設置為null時,該對象將不再可訪問,並且GC會收集它。

將靜態方法視為方法。 無論對象是否存在,它們都可用。 它們對垃圾收集沒有影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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