假設我有以下類:垃圾回收器如何處理靜態類使用的對象?
public class Class1
{
private Class2 _class2;
public void SomeMethod()
{
_class2 = new Class2();
}
}
這是我的,當我打電話var instance = new Class1()
會發生什麼的理解:
- 如果它不存在,則在堆上創建了一個新類型的對象爲
Class1
instance
在堆上創建的,它的類型的對象指針指向Class1
類型對象
問題1:將一種類型的對象來爲Class2
,因爲Class1
引用它創建的,儘管我還沒有實例化一個還沒有(假設它不存在,當然)?
現在假設我有以下的靜態類
public static class StaticClass
{
private static NormalClass _normalClass = new NormalClass();
public static void SomeMethod()
{
// Does something using _normalClass
}
}
當我打電話SomeMethod()
,在堆上創建StaticClass
類型對象。
_normalClass
也被創建,因此是NormalClass
類型對象。
我知道StaticClass
Type對象永遠不會被垃圾收集。任何因爲它持有對_normalClass
的引用,那也不會。
問題2:是否收集類型對象垃圾?如果是這樣,NormalClass
的類型對象是否可以進行垃圾收集? NormalClass
中引用的任何內容的Type對象怎麼樣?
當我創建一個看起來很無辜的靜態類時,我是否有可能填滿了一堆無法收集垃圾的類型對象的大型「鏈」?
就像一個筆記,它可能會有人會抱怨你的靜態類的成員沒有被標記爲靜態的事實。儘管如此,我認爲你有這個觀點。 – Magus
謝謝,編輯得當。 –
您對CLR的運作方式有着非常錯誤的心理模型。 Type對象只有在使用Reflection時纔會創建。有些內部結構會在抖動首次遇到類型時跟蹤類型。他們不是垃圾收集。 –