我正在调用一个c函数,它分配大约900 mb的大缓冲区。 如果我在wpf应用程序的最开始调用此函数,则分配成功,但如果在创建其他一些对象后调用它,则该函数会抛出内存不足异常。在任何时候,我的wpf应用程序不会使用超过200 MB的内存(不包括900 MB)。
我也尝试使用
压缩LOHGCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
确保足够的连续内存可用于900 MB的分配,但它也没有帮助。 它是一个32位的wpf应用程序。我也尝试使用/ 3gb开关,它也没有帮助。
可能是什么问题?
答案 0 :(得分:2)
内存变得支离破碎:-)你无法控制它。地址空间为3 GB,只需要4页内存(4kb * 4 = 16kb)就可以满足900mb的要求。
解决方案可以是:
64位
没有分配900 MB的单个块(如果它是一个内存映射文件,文件可能不是完全映射,而是通过滑动窗口)
在应用程序的开头,预先分配900mb并给出C方法已经分配的这块内存(请注意,我不认为有900mb的地址空间有很强的保证可在应用程序开始时访问)
与上一个类似:在程序开始时,使用VirtualAlloc
只为900 MB的内存分配地址空间。你用" real"填充这个地址空间。需要时记忆,当你不需要时,你可以释放内存(不占用地址空间)。通过这种方式,地址空间不会变得支离破碎。