【发布时间】:2011-07-12 09:07:03
【问题描述】:
我有一个没有内存泄漏的 GUI 应用程序。我已经在多个测试周期中通过 FastMM 确认了这一点。 在一个特定客户端的服务器上,我遇到随机崩溃。服务器规格与我们其他客户端的规格非常一致(我们实际上已经在各种硬件上尝试过),程序使用的文件也是如此(据我所知,我有一些超级敏感的材料无法访问,但那里似乎没有任何异常)。
我已经尝试过 EurekaLog 和 MadShi 之类的工具,也许可以缩小问题的范围,但不幸的是,它们似乎只是偶尔在崩溃时捕获异常,而不是一直。当它发生时,它通常会在崩溃之前显示一个或多个“内存不足”错误。
所以我在想可能有些对象“太晚”被释放了,即只有在应用程序关闭时才释放,而不是在我打算释放它们的时候?我看过 FastMMUsageeTracker 演示,但无法真正理解这一切。任何地方都有文档吗?或者有人可以输入(有点容易理解的)单词,我该如何检查这个?
或者,检测应用程序正在接近其“内存限制”以采取一些预防措施的最佳方法是什么?如果我理解正确,一个普通的 Delphi 应用程序是 32 位的,它应该可以很好地处理高达 2Gb 的内存(当然前提是硬件支持它),对吗?
PS:Delphi 2009 或 XE,如果相关的话
谢谢!
编辑 - 问题可能已解决
我们发现了一个问题,即一段时间后会自动关闭并自行释放的弹出窗口的创建速度比消失的速度要快得多。随着时间的推移,这会消耗大量内存,然后任何内存分配基本上都会把它带到边缘并触发“内存不足”问题。
这可以解释为什么堆栈跟踪不一致。
我并不完全相信这是我们唯一的问题,因为即使不太可能,这种情况很可能在我们的应用程序运行多年之前就发生过,但不知何故并没有。我会在这个问题上做更多的挖掘。
感谢所有回复的人,每个答案实际上都包含有价值的信息。
【问题讨论】:
-
PS 内存不足异常可能发生在大约 1 GB 以上的任何地方 - 没有预定义的级别。似乎有很多因素会影响确切的阈值:总 RAM、总虚拟内存、其他进程正在使用多少等。另外,我下面的代码最初来自 FastMM 内存跟踪器!
-
有一点值得注意:在我从事的项目中,我从来没有设法耗尽可用内存,但我也遇到过几次内存不足的错误。在某些情况下,当您真正需要的只是几 K 或更少时,尝试请求内存管理器分配大小为几 GB 的单个缓冲区的损坏或计算错误的数据可能会导致此问题。
标签: delphi memory out-of-memory