2013-06-03 14 views
1
鉅額

假設我創建了一個類,使對象使用大量內存,但沒有非託管資源:應歸入使用內存impmlement System.IDisposable的

class TestMemory 
{ 
    public int[] intarray = new int[1000000]; 
} 

通常情況下,如果我創建一個對象這個類,並且在使用之後放棄所有對該對象的引用,垃圾收集器將最終負責釋放內存。

的問題是,它是不確定的,當垃圾收集器會做到這一點。它可能會需要幾秒鐘,也許是垃圾收集器之前甚至幾分鐘將釋放

假設我要經常重新創建此對象的內存,例如像這樣(我知道,MOT有效):

for (int i=0; i < 1E10; ++i) 
{ 
    List<TestMemory> myList = new List<TestMemory>(); 
    for (int j=0; j < 400; ++j) 
    { 
     myList.Add(new TestMemory()); 
    } 
} 

應該我擔心內存不足,或者當請求的內存超過當前可用時,垃圾收集器會執行額外的收集操作嗎?爲此託管代碼實施IDisposable是否明智?

+0

請告訴,會是什麼'的Dispose()'覆蓋嗎?此外,在你的榜樣,沒有GC可以釋放任何內存(更不用提,它不會調用'Dispose',或以其他方式關心'IDisposable',反正) - 所有對象依舊可達雖然'myList'。 – delnan

+0

好吧,我簡單的問題了一點,但假設我的課聚集其他非IDisposable的對象,那麼廢棄(布爾)可以設置其引用到零,或者如果我班有一個巨大的字典,它可以清除()這本詞典。 –

回答

2

NO

IDisposable的是其中擁有非託管資源(文件句柄,SQL事務,分配從本地庫)類。

1

如果一個人認爲的存儲器爲各種尺寸的倉庫的集合,一個.NET GC週期是有點相當於找到哪個引用存在的所有對象,移動所有這樣的對象是在一個特定的倉庫到不同的倉庫,將物體從中移出的倉庫,以及在舊倉庫上建立一個新的空倉庫。一般來說,當一個小倉庫已滿,在他們找到的物體會搬到一個更大的,直到過得到充分(於是對象將有獲得移動到一個更大的一個)。

需要注意的重要一點是,即使系統有某種方式知道某個倉庫中某個特定對象沒有引用,該信息也不會很有幫助,因爲系統通常不會關心倉庫中的物品,但沒有任何參考物存在。按順序分配倉庫空間要比試圖在這裏和那裏分配小塊零件更快更容易,並且動態和重新構建倉庫同樣簡單快捷。

在幾種情況下,使用大類類型的代碼可能會受益於在放棄對數組本身的最後一個引用之前清空數組中的所有引用(特別是如果數組本身非常非常舊的,但包含對大多數新對象的引用)。但是,一般來說,人們應該認爲系統在需要回收內存時將執行GC循環,並且不會從可以更快回收內存的知識中受益。