delphi - 如何找出特定组件或类使用了多少内存?

标签 delphi memory components

是否可以检索delphi中单个组件使用的内存量?

我正在从互联网下载简单的字符串,在下载过程结束时我发现内存使用量高达一千兆字节,但是当我查看包含我下载的所有内容的保存文件时,该文件仅在千字节范围内,显然组件发生了一些问题,即使我销毁了它们。

示例:

编辑:

procedure TForm1.OnCreate(Sender: TObject);
  var list: TStringList;
begin
  list:=TStringList.Create;
  list.LoadFromFile('10MB_of_Data.txt');
  list.destroy;
end;

我如何知道“list”作为 TStringList 使用了 10 MB 的内存空间?

谢谢。

最佳答案

我认为比较前后的内存使用情况是解决这个问题的方法,因为没有简单的方法可以查看代码块在事后分配了哪些内存......例如,使用上面的字符串列表,类本身只会占用少量内存,因为它由指向其他分配的指针(即字符串数组)组成,并且它本身是指向实际字符串的指针数组......这是一个比较简单的案例。

无论如何,这可以通过 FastMM 来完成,其函数如下......

uses
  FastMM4;

function CheckAllocationBy(const AProc: TProc): NativeUInt;
var
  lOriginalAllocated: NativeUInt;
  lFinalAllocated: NativeUInt;
  lUsage: TMemoryManagerUsageSummary;
begin
  GetMemoryManagerUsageSummary(lUsage);
  lOriginalAllocated := lUsage.AllocatedBytes;
  try
    AProc;
  finally
    GetMemoryManagerUsageSummary(lUsage);
    lFinalAllocated := lUsage.AllocatedBytes;
  end;
  Result := lFinalAllocated - lOriginalAllocated;
end;

并且可以像这样使用...

lAllocatedBytes := CheckAllocationBy(
  procedure
  begin
    list:=TStringList.Create;
    list.LoadFromFile('10MB_of_Data.txt');
    list.Free;
  end);

这将告诉你你的字符串列表留下了多少字节(有趣的是,我在第一次运行重复调用时得到了 40 个字节,在调用之前和之后查阅使用日志后得到了 0 个字节,这是在调用之前和之后创建的两个编码类)第一次通话)。如果您想检查泄漏的内存分配在哪里,使用 FastMM 也很简单(尽管我同意上面的观点,如果是第 3 方,那么这不应该是您的问题)。

关于delphi - 如何找出特定组件或类使用了多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15622455/

相关文章:

c# - 如果我使用 AllocHGlobal 分配一些内存,我是否必须使用 FreeHGlobal 释放它?

ios - 我可以防止 iOS 关闭电子邮件撰写窗口,丢失用户数据吗

hadoop - 可以将 Hbase 用于 Hive 吗?

c# - .NET 的免费条码 API

angular - 同一 Angular 6 组件的多个实例

delphi - 使用按角色过滤的 View Firebird

sockets - Windows服务中的Indy UDP Server无法监听

delphi - 在 Delphi 2010 上使用 HIDController

delphi - 使用Delphi中的十六进制内存值进行常量单

delphi - 在更多项目上加载资源(图像)