如何在 Delphi 应用程序中找到大量内存消耗的来源?

How to find the source of a big memory consumption in a Delphi application?

我在 Delphi 10 Seattle 中编写的应用程序正在经历非正常的内存消耗。它是一种客户端服务器胖客户端类型的应用程序,使用 SDAC 的 Devart 作为数据库组件。

我不知道具体的工具,但我想知道是什么原因导致内存消耗。

我观察到以下情况:当我启动命令时,exe 使用的内存增长很多(最多 1 GB,在过去最多使用 200MB 的应用程序中),有时这会以out of memory 错误。内存不足错误的堆栈跟踪没有用,似乎是随机的。

谁能推荐一种研究内存消耗的技术?

我目前正在研究 FastMM4 的内存泄漏,我设法删除了一些,但只有一些小问题(TStringlist 或一些小的 TBitmap),没有任何理由证明 1GB 的内存消耗是合理的。

有没有办法说“unit4.pas 已分配 100MB RAM”或任何其他类似有用的内存使用报告?

非常感谢。

因为我不知道完成这项任务的工具,所以我感到很困惑。

您需要的是一个好的 memory/allocation 分析器。

我不知道在这样的分析器中哪些特性是典型的,哪些不是,因为我只用过一个,但我使用的那个允许在 运行 期间随时获得一份报告,显示所有分配的内存以及在应用程序中分配内存的位置。

您是否使用 BLOB type? If yes then figure out the largest datasets and see if avoiding them avoids memory consumption. With PHP 7.1 I had a similar problem with MySQLi on TEXT columns (older bug and ).

查询数据库 table 列

实际上 solving/preventing 肯定可以解决内存消耗问题 - database abstraction layer 肯定知道另一种查询此类列的方法,这种方法对服务器和客户端都更好。请随意编辑此答案以包含您的实际代码。