English 中文(简体)
寻找记忆泡泡
原标题:
  • 时间:2009-02-04 01:37:36
  •  标签:

这个要么非常简单,要么太复杂了...

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

所以我们似乎有一个内存泡泡或袋子。每次运行它时,它都会累积更多的内存,就像一个TList不断添加新项目,但旧项目从未被删除。然后在关机过程中,所有项目都被销毁。网格中显示的行数不会增加,但幕后有很多对象列表使其工作,因此位置不确定。

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

提前感谢!

更新:每次刷新会使用额外的10-50K内存。用户报告最终应用程序停止响应。它确实像内存泄漏一样,但FastMM(内存管理器)没有看到任何泄漏。我将尝试一些其他内存工具...

最佳回答

只需按下F8键通过关键部分,然后查看进程使用图表(Mark Russinovich的Process Explorer非常适合此操作)。当您找到罪魁祸首方法时,请重复此过程但进入该方法。

问题回答

类似于AQTime这样的工具可以报告快照间内存/对象使用差异。这可能会帮助您找出是什么导致了增长。

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

这可能是米达斯。Andreas已经有了解决方案。

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

这是每次刷新数据都发生,还是只有第一次发生?如果只有第一次发生,可能是系统仅为您的应用程序保留了内存,尽管此时并未使用。(也许在某一时刻,旧数据和新数据同时存在于内存中?)

有很多工具可以提供关于内存泄漏的信息,你试过其他的工具吗?

我不是FastMM专家,但我认为在内存管理器获取内存后,在释放对象/组件后,它会使用一些零或标志来保留以备将来使用,避免每次都需要向操作系统请求更多内存,就像一个缓存一样。

How about you create the same form/open same data, N times in a row? Will increase 50K each time?

曾经我也遇到过同样的问题。应用程序肯定有泄漏,但在关闭时我没有收到任何报告。原因是我在项目的 uses-section 中包含了 sharemem。

你试过完整的FastMM版本吗?我发现调整它的设置可以给我更详细的内存使用信息。

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





相关问题
热门标签