Delphi:FastMM虚拟内存管理参考?

时间:2011-03-28 17:17:59

标签: delphi memory-management fastmm

我最近遇到了一个问题(请参阅我的上一个问题),这让我仔细研究了我的Delphi应用程序中的内存管理。在我第一次探索之后,我有两个问题。

我开始玩FastMMUsageTracker,并注意到以下内容。当我打开应用程序使用的文件(也会创建表单等...)时,应用程序的可用虚拟内存变化与“FastMM4已分配”内存的变化之间存在显着差异。 / p>

首先,我对术语感到有点困惑:为什么会有一些FastMM分配的内存和一些“系统分配”(和保留)的内存?由于FastMM是内存管理器,为什么系统负责分配一些内存?

另外,如何获得有关已分配内存的对象/结构的更多详细信息? VM图表仅用于显示“系统分配”,“系统保留”或“FastMM已分配”的内存量,但没有指向需要该内存的实际对象的链接。例如,是否可以获得报告,执行中期,类似于FastMM在关闭应用程序时生成的内容? FastMM显然在某处存储了这些信息。


作为对我的奖励,如果人们可以就该主题推荐一个好的参考书(书籍,网站),也会非常感激。网上有大量的信息,但通常都是针对特定案例和面向专家的。

谢谢!

PS:这不是发现漏洞,没有问题,只是试图更好地理解内存管理并为未来做好先发制人,因为我们的应用程序使用越来越多的内存。

3 个答案:

答案 0 :(得分:3)

您的一些问题很简单。嗯,无论如何其中之一!

  

为什么会有一些FastMM分配   内存和一些“系统分配”   (并保留)记忆?因为FastMM是   内存管理器,为什么是系统   负责分配一些   存储器?

您在Delphi中编写的代码只是您的流程中运行的代码的一部分。您以DLL的形式使用第三方库,最着名的是Windows API。例如,在你创建Delphi表单的任何时候,它背后都有许多消耗内存的windows对象。这个内存不会被FastMM分配,我认为你的问题就是所谓的“系统分配”。

但是,如果你想更深入,那么这很快就会成为一个极其复杂的话题。如果你想深入了解Windows内存管理的实现,那么我认为你需要咨询一个严肃的参考资料。我建议Mark Russinovich,David Solomon和Alex Ionescu Windows Internals

答案 1 :(得分:2)

  

首先,我对术语感到有点困惑:为什么会有一些FastMM分配的内存和一些“系统分配”(和保留)的内存?由于FastMM是内存管理器,为什么系统负责分配一些内存?

你认为FastMM在哪里获得要分配的内存?当然,它来自系统。

当您的应用启动时,FastMM会从系统中获取一块内存。当您要求使用某些内存时(无论是使用GetMem,New还是TSomething.Create),FastMM会尝试从第一个初始块提供给您。如果那里还不够,FastMM会从系统中请求更多(如果可能的话,在一个块中),并返回一大块给你。当你释放某些东西时,FastMM不会将该内存返回给操作系统,因为它表示你会再次使用它。它只是在内部标记为未使用。它还尝试重新排列未使用的块,以便它们尽可能连续,以便不必为了更加不必要地返回操作系统。 (但是,这种重新调整并不总是可行的;那就是你最终会因为多次调整动态数组大小,大量对象创建和释放等等而导致内存碎片化。)

除了应用程序中FastMM管理的内存之外,系统还为堆栈和堆留出了空间。每个进程在启动时都会获得一个巨大的堆栈空间,作为放置变量的空间。这个堆栈(和堆)可以根据需要动态增长。

当您的应用程序退出时,它分配的所有内存都将释放回操作系统。 (它可能不会立即出现在任务管理器中,但确实如此。)

  

例如,是否可以获得报告,执行中期,类似于FastMM在关闭应用程序时生成的内容?

据我所知。因为FastMM将它存储在某个地方并不一定意味着有一种方法可以在运行时从内存管理器外部访问它。您可以查看FastMMUsageTracker的源代码,了解如何检索信息(使用RefreshSnapshot方法中的GetMemoryManagerState和GetMemoryMap)。 FastMM4的来源也可用;您可以查看并查看可用的公共方法。

FastMM自己的文档(以自述文件形式,FastMM4Options.inc注释和FastMM4_FAQ.txt文件)在某种程度上有助于解释它是如何工作的以及可用的调试选项(和信息)。

答案 2 :(得分:0)

有关进程正在使用的内存的详细地图,请尝试www.sysinternals.com中的VMMAP(也由Mark Russinovich共同撰写,David的回答中提到)。这也允许您查看某些位置中存储的内容(选择细节线时键入control-T)。

警告:您的进程使用的内存比您想象的要多得多。您可能需要先阅读本书。