Bou*_*gui 7 memory delphi out-of-memory
我有一个没有内存泄漏的GUI应用程序.我已经通过FastMM在多个测试周期中证实了这一点.在一个特定客户端的服务器上,我得到随机崩溃.服务器规格与我们其他客户端的规格完全一致(我们实际上已尝试过各种硬件),程序使用的文件也是如此(据我所知,我有一些超敏感材料)无法访问,但似乎没有任何与众不同的东西).
我尝试过像EurekaLog和MadShi这样的人,可能会缩小这个问题的范围,但不幸的是,他们似乎只是偶然发现了一个例外,而不是所有时间.当它发生时,它通常会在崩溃之前显示一个或多个"Out of memory"错误.
所以我想也许有些对象可能"太迟"了,即只有当应用程序关闭时才会被释放,而不是当我意味着释放它们时?我见过FastMMUsageeTracker演示,但实际上并没有真正理解它.有文件吗?或者有人可以放入(有些可访问的)单词,我怎么去检查这个?
或者,检测应用程序是否接近其"内存限制"的最佳方法是什么,以便采取一些预防措施?如果我理解正确,一个普通的Delphi应用程序是32位,它应该很好处理高达2Gb的内存(当然硬件支持它),对吗?
PS:Delphi 2009或XE,如果相关的话
谢谢!
编辑 - 问题可能已解决
我们能够找到一个问题,一个弹出窗口关闭并在一段时间后自动释放自己的速度比它消失的速度快得多.随着时间的推移,这将占用大量内存,然后任何内存分配基本上会使其超越边缘并触发"内存不足"问题.
这可以解释为什么堆栈跟踪不一致的地方.
我并不完全相信这是我们唯一的问题,因为尽管不太可能,但在我们的应用程序运行多年之前,这种情况很可能已经发生,但不知何故它没有.我会在这个问题上做更多的挖掘.
感谢所有回复的人,每个答案实际上都包含有价值的信息.
忘掉"Windows"内存 - 你想要的是应用程序分配的实际内存.这是您可以判断是否正在分配未随时间释放的内存的唯一方法.对于带有FastMM的Delphi 2006+,这就是您所需要的:
//------------------------------------------------------------------------------
// CsiGetApplicationMemory
//
// Returns the amount of memory used by the application (does not include
// reserved memory)
//------------------------------------------------------------------------------
function CsiGetApplicationMemory: Int64;
var
lMemoryState: TMemoryManagerState;
lIndex: Integer;
begin
Result := 0;
// get the state
GetMemoryManagerState(lMemoryState);
with lMemoryState do begin
// small blocks
for lIndex := Low(SmallBlockTypeStates) to High(SmallBlockTypeStates) do
Inc(Result,
SmallBlockTypeStates[lIndex].AllocatedBlockCount *
SmallBlockTypeStates[lIndex].UseableBlockSize);
// medium blocks
Inc(Result, TotalAllocatedMediumBlockSize);
// large blocks
Inc(Result, TotalAllocatedLargeBlockSize);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我在一段时间(10秒到10分钟之间)记录到我的日志文件,以及与上次的差异.
| 归档时间: |
|
| 查看次数: |
5678 次 |
| 最近记录: |