是否可以检索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/