Fastmm4何时会出现虚拟内存问题?

3
我们有一个应用程序,其虚拟内存不断上升,在一天后达到了约500MB。尝试对应用程序进行分析,它会访问数据库并发出大量的http和soap请求,但是Fastmm4显示没有泄漏。我不确定内存何时被占用,以及是否存在虚拟内存上升的问题。 JD
5个回答

7
可能不是"泄漏"内存,而是更多地"囤积"内存。只有在应用程序无法释放内存时,内存才会泄漏,例如在指针丢失后。
当创建对象时就会占用内存,并在销毁对象时(或者如果对象被覆盖为新对象时丢失)释放内存。内存泄漏是指内存从未被释放(在应用程序关闭后)。可能是应用程序运行期间某个对象未被释放,但如果将该对象添加到对象列表或数组中,则该列表/数组会继续增长(而不是覆盖)。如果这些对象由应用程序拥有,则在应用程序关闭时它们会自动释放,但直到应用程序关闭之前都不会释放。FastMM没有报告任何内存泄漏(因为所有内存在应用程序关闭时都已被释放)。
内存分析器可以显示当前内存中每个对象的数量以及对象类别(我们也使用 AQ Time 进行此操作)。您需要在一小时/两小时/三小时后查看内存概要。大多数长时间运行的应用程序(我所知道的所有应用程序)都具有相当稳定的(长期)内存需求,内存中的每个对象也保持相当稳定。显然,在应用程序繁忙时可能会出现峰值,但这些应该会回到一个稳定的水平。查看是否有任何对象计数在持续增长。
我猜测应用程序动态创建了某个具有窗体或应用程序作为其父级的内容,并将其添加到列表末尾,但未释放它。该对象一直存在于内存中,直到应用程序关闭,但每个新对象都需要更多的内存。

谢谢JamesB。我会下载AQ Time并查看是否能给我更多信息。 - JD.
1
“泄漏”是指内存在应用程序关闭后从未被释放。我认为在任何现代操作系统上,除非有来自错误驱动程序或单独应用程序的帮助(例如通过与其通信触发该应用程序中的泄漏),否则不可能实现这一点。一旦进程终止,它分配的所有内存都将被释放。 - Mihai Limbășan
3
我认为他的意思是:“泄漏指的是内存直到应用程序关闭之前从未被释放,而应该更早地释放。” - Mason Wheeler
在使用 AQTime 进行分析后,我们发现在数据库层面创建了大量的缓存对象。我们决定在几个小时后清空缓存,这样问题就解决了。感谢所有的帮助,没有 AQTime 我们可能不会发现这个问题。 - JD.

4

3

您可以尝试一些分析器应用程序,以跟踪在某个点分配的对象类型,甚至可以制作自己的工具来转储已分配的对象。不想宣传,但我们已经成功使用了AQTime。


3
最后但并非最不重要的,堆碎片问题也可能存在。使用FastMM4时这种情况很少见,但检查一下也是明智的。
最简单的解决方案是在应用程序中记录堆管理器(getheapstatus)的统计信息,并检查FreeBig和FreeSmall是否占据了大部分缺失的内存。如果是这样,那么堆碎片就是你主要的问题。
Totalallocated字段包含程序使用的内存量。如果这个值很高,说明你正在使用内存,但在关闭时释放它。
这可以是任何东西,包括定期将一些信息记录到备忘录或TStringList中等。
在关闭时进行总分配日志记录可能有助于确定内存留在哪里。

3
我们的Win2008中间层服务器也遇到了类似的问题。如果您恰好在Windows 2008服务器(或Win7)上使用MDAC(ADO)并且进行大量连接,则MS代码中存在一个泄漏,用于清除连接信息。据微软表示:“泄漏发生在一些安全代码中,用于删除连接字符串中的密码等内容。解决方法可能是在连接字符串中包含以下内容:“Persist Security Info = true”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接