【问题标题】:MemoryFailPoint fires to early in WinXP 64MemoryFailPoint 在 WinXP 64 早期触发
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多