900 mb 内存分配失败

900 mb memory allocation fails

我正在调用一个分配大约 900 MB 大缓冲区的 c 函数。 如果我在 wpf 应用程序的最开始调用此函数,分配会成功,但如果在创建其他几个对象后调用它,则该函数会抛出内存不足异常。在任何时候,我的 wpf 应用程序都不会使用超过 200 mb 的内存(不包括 900 mb)。

我还尝试使用

压缩 LOH
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();

确保有足够的连续内存可用于 900 MB 的分配,但这也无济于事。 它是一个 32 位 wpf 应用程序。我也尝试过使用 /3gb 开关,但它也没有帮助。

可能是什么问题?

内存变得碎片化 :-) 你无法控制它。 3gb的地址space,你只需要4页内存(4kb * 4 = 16kb)就不可能请求900mb。

解决方案可以是:

  • 要 64 位

  • 不分配单个900 MB的块(如果是内存映射文件,文件可以不完全映射,但可以滑动window)

  • 在应用程序的开头,预分配 900mb 并为 C 方法提供这块已经分配的内存(请注意,我认为不能强有力地保证 900mb地址 space 可在应用程序启动时访问)

  • 与前面的类似:在程序的开头,使用 VirtualAlloc 您只分配地址 space 用于 900 MB 的内存。你在需要的时候用"real"内存填充这个地址space,不需要的时候释放内存(不释放地址space)。这样地址space就不会碎片化了。