[英]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.