【发布时间】:2010-04-11 16:50:11
【问题描述】:
我创建了一个具有自组织内存管理的卷类(称为 VoxelVolume),因为 C# 中的 GC 没有提供良好的机制来管理卷内容以进行映射、取消映射和重新映射。虽然我可以使用虚拟内存的机制,但问题是文件通常太大而无法放入页面文件,我不想强迫用户增加页面文件的大小。
目前该系统运行良好,没有资源不足和 OutOfMemoryExceptions 的问题,因为使用 MemoryFailPoint 的 InsufficientMemoryException 运行良好。这是在 32 位 WinXP 系统上进行的所有测试,主存为 2GB。
在具有 32GB 主存的 64 位系统上运行相同的机制也可以正常工作,但是当应用程序运行时,MemoryFailPoint 突然抛出异常,尽管 24GB 主存仍然可用。还有一点就是当MemoryFailPoint触发一次的时候,每次都会触发,没有机会摆脱它。
到目前为止,我所读到的有一个小对象和一个大对象堆(SOH 和 LOH)。但只有对于 SOH,GC 才真正负责,我可以通过应用 GC.Collect() 和 GC.WaitForPendingFinalizers 将 SOH 从未使用的对象中释放出来。 MemoryFailPoint 显然是对 LOH 进行一点点控制的唯一方法,但由于系统上还有足够的内存,我认为没有理由触发 MemoryFilePoint。
这里有使用 MemoryFailPoint 的经验吗?
感谢您的帮助 马丁
【问题讨论】:
-
您对 MemoryFailPoint 的体验非常有趣。 MSDN Docs 写得不好。您能否提供一些有关您如何使用 MFP 的信息?
标签: c# memory-management