C#无法占用新内存
本文关键字:内存 新内存 | 更新日期: 2023-09-27 18:09:52
我正在做一个c#-c++(管理(混合项目,我们意识到我们的项目中存在内存泄漏,所以我搜索发现,c++部分的析构函数从未调用过,所以我写了一段代码来释放内存。现在,我可以看到程序在内存中增长较慢(内存泄漏更多(,但问题是,在c部分,程序由于"out of memory exception
"而开始崩溃。在等操作中
double []k = new double[65536];
程序的内存使用量通常看起来是400-500mb,但它崩溃了
OS:win服务器2003
内存:4 GB
操作系统应该让程序增长近1200 mb,但在我写下空闲内存部分后,它开始崩溃400-500 mb
我从c#部分调用了这个c++函数来释放内存
freeMemories()
{
if(!mIsAlreadyFreedMemory)
{
mIsalreadyFreedMemory = true;
_aligned_free(pointerA);
_aligned_free(pointerB);
....
}
}
为什么它不能获取新内存,程序不能再次获取释放的内存?
您应该对对象使用IDisposable
模式。基本思想是:
public class MyObject : IDisposable
{
// Some unmanaged resource:
UnmanagedResource unmanaged;
// Finalizer:
~MyObject
{
DisposeUnmanaged();
}
public void Dispose()
{
DisposeManaged();
DisposeUnmanaged();
GC.SuppressFinalize(this);
}
protected virtual DisposeManaged()
{
// Dispose _managed_ resources here.
}
protected virtual DisposeUnmanaged()
{
// Dispose _unmanaged_ resources here.
this.unmanaged.FreeMe();
this.unmanaged = null;
}
}
然后,一旦确定不再需要对象,就可以对其调用Dispose
,并且非托管内存将被释放。
MyObject obj;
obj.Dispose();
或者,如果忘记调用Dispose
,则当垃圾收集器(通过终结器(收集对象时,非托管资源将被释放。
我找到了解决问题的方法。问题的原因是内存碎片。在我的项目中,在项目的c++部分有很多大的(0.5 mb*(15-20分配((对齐的内存分配,所以在分配和释放内存之后,连续地。有足够的内存用于将来的操作,但它被拆分为小部分。为了防止这种情况,我使用了内存池模式。而不是大量分配。我分配了一个大池,并将其用于所有带有指针的数组。所以在c部分操作中,如
double[]k=新的double[65536]
操作现在不会造成问题。