【问题标题】:C# cannot take new memoryC# 不能占用新内存
【发布时间】:2013-04-18 06:35:56
【问题描述】:


我正在做一个 c# - c++(管理)混合项目,我们意识到我们的项目中存在内存泄漏,所以我搜索并发现,c++ 部分的析构函数从未调用过,所以我写了一段代码来释放内存。现在我可以看到程序在内存中的增长速度较慢(内存泄漏更多),但问题是,在 c# 部分程序由于“out of memory exception”而开始崩溃。在操作中如

double []k = new double[65536];

程序的内存使用通常看起来是 400-500mb,但它崩溃了。
操作系统:win server 2003
内存:4 GB
操作系统应该让程序增长近 1200 mb,但在我写完空闲内存部分后,它开始崩溃 400-500mb。
我从 c# 部分调用了这个 c++ func 来释放内存

freeMemories()
{
   if(!mIsAlreadyFreedMemory)
   {
      mIsalreadyFreedMemory = true;
      _aligned_free(pointerA);
      _aligned_free(pointerB);
       ....
    }
}

为什么它不能占用新的内存,程序不能再次占用释放的内存?

【问题讨论】:

  • 不是重复的,但这个stackoverflow.com/questions/1391672/… 可能与您的问题有关:考虑从静态数组切换到集合
  • "双 k = 新双 [65536];"这只是一个例子,我的项目中有很多不同的数组分配,所以我不能切换它们,而且它不会崩溃一个精确的点。
  • 发布您编写的用于释放内存的代码如何?另外,请注意,由于没有足够大的连续块剩余,当显然有大量可用内存时,内存碎片可能会导致“内存不足”。
  • 我添加了 freememory 部分,但问题是没有占用 c++ 内存分配。 (它可以再次对齐内存)。 C#部分不能。
  • double k = new double[65536] 在 C# 和 C++ 中都不正确

标签: c# memory-management managed-c++


【解决方案1】:

您应该为您的对象使用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,则在垃圾收集器(通过终结器)收集对象时将释放非托管资源。

【讨论】:

  • 它是 0.5Mb 而不是 Gb,所以它很大但不是很大。我会尝试 IDisposable。
【解决方案2】:

我找到了解决问题的方法。问题的原因是内存碎片。在我的项目中,在项目的 c++ 部分中有很多大的(0.5 mb *(15-20 分配))对齐的内存分配,所以在分配和释放内存之后,不断。有足够的内存用于未来的操作,但它被分成小部分。为了防止这种情况,我使用了内存池模式。而不是进行大量分配。我分配了一个大池并将其用于所有带有指针的数组。所以在c#部分操作如;
双 []k = 新双 [65536];
操作现在不会引起问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多