900 MB的内存分配失败

时间:2015-05-21 08:59:41

标签: c# .net wpf memory memory-management

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

我也尝试使用

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

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

可能是什么问题?

1 个答案:

答案 0 :(得分:2)

内存变得支离破碎:-)你无法控制它。地址空间为3 GB,只需要4页内存(4kb * 4 = 16kb)就可以满足900mb的要求。

解决方案可以是:

  • 64位

  • 没有分配900 MB的单个块(如果它是一个内存映射文件,文件可能不是完全映射,而是通过滑动窗口)

  • 在应用程序的开头,预先分配900mb并给出C方法已经分配的这块内存(请注意,我不认为有900mb的地址空间有很强的保证可在应用程序开始时访问)

  • 与上一个类似:在程序开始时,使用VirtualAlloc只为900 MB的内存分配地址空间。你用" real"填充这个地址空间。需要时记忆,当你不需要时,你可以释放内存(不占用地址空间)。通过这种方式,地址空间不会变得支离破碎。