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就不会碎片化了。
我正在调用一个分配大约 900 MB 大缓冲区的 c 函数。 如果我在 wpf 应用程序的最开始调用此函数,分配会成功,但如果在创建其他几个对象后调用它,则该函数会抛出内存不足异常。在任何时候,我的 wpf 应用程序都不会使用超过 200 mb 的内存(不包括 900 mb)。
我还尝试使用
压缩 LOHGCSettings.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就不会碎片化了。