ERROR_NOT_ENOUGH_MEMORY故障排除

Jos*_*ley 5 debugging memory-management out-of-memory

我们的应用程序在一个特定用户的计算机上失败ERROR_NOT_ENOUGH_MEMORY("没有足够的存储空间来处理此命令").

这个错误显然是在我们正在使用的Delphi VCL框架内的某个地方引发的,所以我不确定哪个Windows API函数负责.

记忆是个问题吗? 致电GlobalMemoryStatus提供以下信息:

  • dwTotalPhys - 1063150000(~1 GB)
  • dwAvailPhys - 26735000(~27 MB)
  • dwAvailPage - 1489000000(~1.4 GB)

我觉得奇怪的是,当页面文件中有足够的空间可用时,Windows会让可用的物理内存变得如此之低,但我对Windows的虚拟内存管理知之甚少,以了解这是否正常.是吗?

如果不是内存,那么哪个资源限制被命中?从我在网上看到的,ERROR_NOT_ENOUGH_MEMORY可能是应用程序遇到几个限制(GDI对象,USER对象,句柄等)的结果,而不一定是内存.是否有一个全面的列表,列出了Windows强制执行的限制?有没有办法找出受到限制的限制?我试过谷歌,但我找不到任何系统的概述.

Jos*_*ley 3

本例中的罪魁祸首是CreateCompatibleBitmap。显然,Windows 可能会对设备相关位图的可用内存执行相当严格的系统范围限制(例如,请参阅此邮件列表讨论),即使您的系统有足够的内存和大量的 GDI 资源。(这些系统范围的限制显然是因为 Windows 可能会在显卡内存中分配与设备相关的位图。)

解决方案只是使用与设备无关的位图 (DIB)(尽管这些可能无法提供那么好的性能)。 此知识库文章介绍了如何为设备选择最佳 DIB 格式。

资源限制的其他候选者(来自其他人的答案和我自己的研究):