重复将变量重新分配给新分配的对象后发生内存不足异常

本文关键字:分配 新分配 内存不足 异常 变量 对象 | 更新日期: 2023-09-27 18:23:44

我有一个加载文件的程序,这些文件通常很大,可能只有几百MB。这还可以,因为运行它的计算机功能强大。

一次只能加载一个文件,当加载新文件时,我会将新文件重新分配给现有文件对象,例如:

myBigFile = new BigFile(fileName);

我一直认为前一个文件会从内存中清除,但我发现在一个接一个地加载几个文件后,我经常会出现内存不足异常。

在将新文件分配给我的文件变量之前,是否需要调用GC.Collect()?我曾以为,一旦不再使用Windows,它就会清除以前的内存?

编辑

除了一些有用的评论之外,我返回并在相关的类和子类中实现了IDisposable,或多或少地使用了Microsoft模板:

例如,将类的数组设置为null,其中每个子类型也有一个Dispose()方法:

public void Dispose()
{
    for (int i = 0; i < myArrayOfClassType.Length; i++)
    {
       myArrayOfClassType[i].Dispose();
    }
    myChannels = null;                
    GC.SuppressFinalize(this);
}

然后,当准备加载一个新文件时,我做了以下操作:

if (myBigFile != null)
{
    //dispose any previous instance:
    myBigFile.Dispose();
    myBigFile = null;
    GC.Collect();
}
myBigFile = new BigFile(fileName);

然而,当加载新文件时,我通常会得到一个错误,尽管刚刚加载,但新加载的文件中的数组将变为null。

是否有可能没有立即处理它们,有时是在进行相关清理时出现的新文件,因此会立即部分处理?

任何见解都将不胜感激。

重复将变量重新分配给新分配的对象后发生内存不足异常

如果加载文件时分配的数组足够大,可以进入大型对象堆,那么您可能会遇到碎片导致的OutOfMemoryException。如果你将LOH分割到1.5GB可用空间,但最大可用空间是100MB,并且你分配了101MB,那么你会得到OutOfMemoryException。

如果是这种情况,您可以查看性能计数器来观察LOH大小,从而了解情况。