寻找记忆泡泡

时间:2009-02-04 01:37:37

标签: delphi memory profiling

这要么荒谬简单,要么太复杂。 。 。

在我们的应用程序中,有一个表单从数据库加载一些数据并将其显示在网格中(简单地说)。刷新数据时,总内存使用量增加约50K(取决于显示的数据量无疑)。听起来像内存泄漏,但是当我们关闭应用程序时,FastMM设置为 ReportMemoryLeakOnShutDown:= True ,并且它不报告任何异常内存泄漏。

所以看来我们有一个记忆泡泡或包。每次运行时累积更多内存的东西。就像 TList一样,不断添加新项目,但旧的项目永远不会被删除。然后在关机过程中,所有项目都被销毁。网格中显示的行不会增加,但幕后有很多对象列表可以使这个工作,所以它可以在任何地方。

所以我的问题是,如果有人知道找出应用程序的哪些部分正在使用多少内存的好方法。 。 。 。我可以想到很多繁琐的方法(我正在做的事情 - 检查我能找到的每个列表),所以我希望有人有一个我没想过的技巧或技巧。

提前致谢!

更新:每次刷新都会导致额外使用10-50K的内存。用户报告最终应用程序停止响应。它当然就像一个内存泄漏,但FastMM(内存管理器)看不到任何泄漏。我会尝试一些其他的记忆工具。 。 。

7 个答案:

答案 0 :(得分:6)

通过关键部分F8,查看流程使用图表(Mark Russinovich的Process Explorer非常适合)。当你找到罪魁祸首方法时,重复这个过程但是进入那个方法。

答案 1 :(得分:6)

AQTime之类的工具可以报告快照之间内存/对象使用的差异。这可能会帮助您找出不断增长的内容。

答案 2 :(得分:3)

看起来有一些内存通过自定义AllocMem()调用分配,绕过FastMM。

这可能是midas。 Andreas has a solution for this

或者其他一些分配东西的InitXXX WinAPI调用,不需要释放。或者项目使用的其他一些第三方或Windows dll。

答案 3 :(得分:0)

每次刷新数据或第一次刷新数据时都会发生这种情况吗?如果它只是第一次可能是系统只为您的应用程序保留内存,尽管它目前没有使用它。 (也许在某些时候,新旧数据同时存在于内存中?)

有许多工具可以为您提供有关内存泄漏的信息,您尝试过不同的工具吗?

答案 4 :(得分:0)

我不是FastMM专家,但我想在内存管理器获取内存之后,在释放对象/组件之后,它将保留以供将来使用一些零或标志,我不知道,避免询问操作系统随时可以获得更多内存,例如缓存。

如何创建相同的表单/打开相同的数据,连续N次? 每次会增加50K吗?

答案 5 :(得分:0)

一旦我遇到同样的问题。该应用程序肯定是泄漏,但我没有关闭关闭的报告。原因是我在项目的使用部分中包含了sharemem。

您是否尝试过完整的FastMM版本?我发现调整它的设置给了我更详细的内存使用信息。

答案 6 :(得分:0)

正如Lars Truijens所提到的,AQTime提供了实时内存消耗图,因此在运行时,您可以在刷新数据时看到哪些对象正在使用更多内存。