首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FastMM虚拟内存管理参考?

FastMM虚拟内存管理参考?
EN

Stack Overflow用户
提问于 2011-03-29 01:17:59
回答 3查看 1.5K关注 0票数 4

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

我已经开始使用FastMMUsageTracker,并注意到以下几点。当我打开要由应用程序使用的文件(它还会创建一个表单等)时,应用程序可用虚拟内存的变化与"FastMM4 allocated“内存的变化之间存在显著差异。

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

此外,我如何才能获得有关分配了该内存的对象/结构的更多详细信息?VM图表仅在显示“系统分配”、“系统保留”或"FastMM分配“的内存量时有用,但没有链接到需要该内存的实际对象。例如,有没有可能得到一个类似于FastMM在关闭应用程序时生成的执行中报告?显然,FastMM会将这些信息存储在某个地方。

作为我的奖励,如果人们能推荐一本好的参考资料(书,网站),我也会非常感激。网络上有大量的信息,但通常都是针对具体案例和面向专家的。

谢谢!

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-29 02:24:19

你的一些问题很简单。好吧,不管怎样,他们中的一个!

为什么会有一些FastMM分配的内存和一些“系统分配的”(和保留的)内存?既然FastMM是内存管理器,为什么系统要负责分配一些内存呢?

用Delphi编写的代码只是进程中运行的代码的一部分。您可以使用DLL形式的第三方库,其中最著名的是Windows API。例如,每当你创建一个Delphi窗体时,它背后都有很多消耗内存的窗口对象。这个内存不是由FastMM分配的,我认为这就是你问题中所谓的“系统分配”。

然而,如果你想更深入,那么这很快就会成为一个极其复杂的话题。如果您确实想更深入地了解Windows内存管理的实现,那么我认为您需要参考一个严肃的参考资料。我推荐马克·鲁西诺维奇、大卫·所罗门和亚历克斯·约内斯库写的Windows Internals

票数 3
EN

Stack Overflow用户

发布于 2011-03-29 03:05:04

首先,我对这个术语有点困惑:为什么会有一些

分配的内存和一些“系统分配的”(和保留的)内存?既然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
EN

Stack Overflow用户

发布于 2011-03-29 03:04:19

有关进程正在使用的内存的详细映射,请尝试来自www.sysinternals.com的VMMAP (也是Mark Russinovich的合著者,在David的回答中提到)。这还允许您查看存储在某些位置的内容(选择详图行时键入control-T )。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5462599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档