我创建了一个具有自组织内存管理功能的卷类(称为VoxelVolume),因为C#中的GC没有提供一种很好的机制来管理卷内容以进行映射,取消映射和重新映射。尽管我可以使用虚拟内存机制,但问题是文件通常太大而无法放入页面文件,并且我不想强迫用户增加页面文件的大小。

当前,该系统运行良好,并且没有资源和OutOfMemoryExceptions的问题,因为使用MemoryFailPoint的InsufficientMemoryException可以很好地工作。所有这些都在具有2GB主内存的32位WinXP系统上进行。

在具有32GB主内存的64位系统上运行相同的机制也可以很好地工作,但是当应用程序运行时,尽管24GB主内存仍然可用,但MemoryFailPoint突然引发异常。另一点是当MemoryFailPoint触发一次时,它将每次触发,并且没有机会摆脱它。

到目前为止,我已经读到了一个小对象和一个大对象堆(SOH和LOH)。但是,仅对于SOH,GC才会真正处理,并且我可以通过应用GC.Collect()和GC.WaitForPendingFinalizers将SOH从未使用的对象中释放出来。很明显,MemoryFailPoint是获得LOH一点控制权的唯一方法,但是由于系统上还有足够的内存,因此我看不出为什么要启动MemoryFilePoint。

使用MemoryFailPoint是否有任何经验?

谢谢您的帮助
马丁

最佳答案

我想MFP是由于内存碎片而触发的。
据我所知,在64位系统中,您仍然无法分配大于2GB的块。

关于c# - MemoryFailPoint在WinXP 64中启动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2617808/

10-10 21:18