应分类使用大量的内存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是否明智?
没有
IDisposable用于拥有非托管资源(文件句柄,SQL事务,本地库分配)的类。
如果将内存视为各种大小的仓库集合,.NET GC循环有点等同于找到所有存在引用的对象,将位于一个特定仓库中的所有对象移动到不同的仓库,从而激发从中移出对象的仓库,并在旧站点上建立一个新的空仓库。 一般来说,当一个小仓库变满时,在它们中找到的对象将被移动到一个更大的仓库中,直到仓库变满为止(因此那里的对象将移动到更大的仓库中)。
需要注意的一点很重要,即使系统有某种方式知道某仓库中的某个特定对象不存在任何参考,这些信息也不会很有帮助,因为系统通常不关心哪些在仓库里,但没有任何参考。 按顺序分配仓库空间要比试图在这里和那里分配小块零件更快更容易,并且动态和重新构建仓库同样简单快捷。
在几种情况下,使用大类数组的类型的代码可能会受益于在放弃对数组本身的最后一个引用之前将数组中的所有引用归零(特别是如果数组本身非常旧,但包含主要是新对象的引用)。 但是,一般来说,人们应该认为系统在需要回收内存时将执行GC循环,并且不会从可以更快回收内存的知识中受益。
链接地址: http://www.djcxy.com/p/54507.html上一篇: Should classed that use huge amounts of memory impmlement System.IDisposable
下一篇: Managed vs Unmanaged Resources in .NET. What's the difference?