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

lke*_*ler 46 delphi memory-management fastmm

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

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

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


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

ape*_*arr 69

您可以从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;
Run Code Online (Sandbox Code Playgroud)

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

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

Jim*_*eth 21

来自我的一篇老博文.

想知道你的程序使用了多少内存?这个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;
Run Code Online (Sandbox Code Playgroud)

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

PROCESS_MEMORY_COUNTERS记录包括:

  • PageFaultCount
  • PeakWorkingSetSize
  • WorkingSetSize
  • QuotaPeakPagedPoolUsage
  • QuotaPagedPoolUsage
  • QuotaPeakNonPagedPoolUsage
  • QuotaNonPagedPoolUsage
  • PagefileUsage
  • PeakPagefileUsage

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