垃圾收集器(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