当前位置:  开发笔记 > 开发工具 > 正文

如何获取Delphi程序使用的内存

如何解决《如何获取Delphi程序使用的内存》经验,为你挑选了2个好方法。

我知道如何使用GlobalMemoryStatusEx获取系统内存,但这告诉我整个操作系统正在使用的内容.

我真的希望我的程序能够报告它单独分配和使用的内存量.

我的Delphi 2009程序中是否有任何方法可以调用Windows函数或某些FastMM函数来查找我的程序单独分配的内存?


重新审视我的问题,我现在已经通过@apenwarr更改了我对GetMemoryManagerState答案的接受答案.它产生了与我以前使用的GetHeapStatus函数(现已弃用)相同的结果,而GetProcessMemoryInfo.WorkingSetSize给出了非常不同的结果.



1> apenwarr..:

您可以从Delphi运行时获取有用的内存使用信息,而无需使用任何直接的Win32调用:

unit X;

uses  FastMM4; //include this or method will return 0.
....

function GetMemoryUsed: UInt64;
var
  st: TMemoryManagerState;
  sb: TSmallBlockTypeState;
begin
  GetMemoryManagerState(st);
  result :=  st.TotalAllocatedMediumBlockSize +
           + st.TotalAllocatedLargeBlockSize;
  for sb in st.SmallBlockTypeStates do begin
    result := result + sb.UseableBlockSize * sb.AllocatedBlockCount;
  end;
end;

关于这种方法的最好的事情是它被严格跟踪:当你分配内存时,它会上升,当你释放内存时,它会立即下降相同的数量.我在运行每个单元测试之前和之后使用它,所以我可以判断哪个测试正在泄漏内存(例如).


使用FastMM4或delphi 2006+时此方法有效,但如果您不使用FastMM4,则应考虑开始使用它!
这可能是我在StackOverflow上看到的最好和最有用的答案.我希望我可以100次投票.
小注:您必须在实现此功能的单元中使用**(=在使用部分中设置)FastMM4.仅仅在项目单元中添加FastMM4是不够的.

2> Jim McKeeth..:

来自我的一篇老博文.

想知道你的程序使用了多少内存?这个Delphi函数可以解决这个问题.

uses psAPI;

{...}

function CurrentProcessMemory: Cardinal;
var
  MemCounters: TProcessMemoryCounters;
begin
  MemCounters.cb := SizeOf(MemCounters);
  if GetProcessMemoryInfo(GetCurrentProcess,
      @MemCounters,
      SizeOf(MemCounters)) then
    Result := MemCounters.WorkingSetSize
  else
    RaiseLastOSError;
end;

不知道我在哪里得到了这个的基础知识,但我添加了一些更好的错误处理,并使其成为一个功能.WorkingSetSize是当前使用的内存量.您可以使用类似的代码来获取当前进程(或任何进程)的其他值.您需要在use语句中包含psAPI.

PROCESS_MEMORY_COUNTERS记录包括:

PageFaultCount

PeakWorkingSetSize

WorkingSetSize

QuotaPeakPagedPoolUsage

QuotaPagedPoolUsage

QuotaPeakNonPagedPoolUsage

QuotaNonPagedPoolUsage

PagefileUsage

PeakPagefileUsage

您可以在任务管理器或Process Explorer中找到所有这些值.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有