垃圾收集器(GC)將爲您完成這項工作 - 最終。在你提出的例子中,你必須小心,因爲在這種情況下GC會嘗試和管理它花費在垃圾收集上的時間與應用程序內存消耗(工作集)的時間。因此,應用程序可能會消耗更多的內存,尤其是在您說明的情況下。
CLR完全自動處理這個內存,你永遠不會自己釋放託管內存。例如,考慮下面的
public void Test()
{
byte[] myArray = new Byte[1000];
// ...
}
時Test
執行時,一個數組來保存1000個字節是在存儲器堆中分配。該數組由變量myArray
引用,存儲在局部變量堆棧中。當這個方法退出時,這個局部變量會超出範圍,這意味着什麼都沒有留下來引用內存堆上的數組。然後,孤立數組有資格被GC回收。然而,這個集合可能不會立即發生,因爲CLR關於是否收集的決定是基於許多因素(可用內存,當前內存分配,自上次收集以來的時間等)。t這意味着,對於收集是否存在不確定的延遲垃圾回收之前所花費的時間。
鑑於上述情況,在您描述的情況下,在循環/包含方法期間內存消耗會大幅增加。這裏要好得多要麼使用一個using
聲明
while (true)
{
using (Image<Gray, Byte> MyImage = new Image<Gray, Byte> (1024, 768))
{
// ...
}
}
或每個循環之後的Image
調用對象的dispose()
。
while (true)
{
Image<Gray, Byte> MyImage = new Image<Gray, Byte> (1024, 768);
// ...
MyImage.Dispose();
}
Asside:你可以隨時檢查這些內存消耗爲自己(使用System.Diagnostics程序)通過查詢性能計數器(測試你的流程的實際內存消耗):
string procName = Process.GetCurrentProcess().ProcessName;
using (PerformanceCounter pc = new PerformanceCounter("Process", "Private Bytes", procName))
Console.WriteLine(pc.NextValue());
注:讀取性能計數器需要管理員權限。
我會冒險猜測,並說是...但我不是100%確定,所以請不要把它當作福音。 – Richard
@Killercam你確定嗎?因爲我聽到了不同的東西,我不知道。在這種情況下,或者一般來說,你的意思是說Image對象可以嗎? – YankeeWhiskey