我知道如何使用GlobalMemoryStatusEx获取系统内存,但这告诉我整个操作系统正在使用的内容.
我真的希望我的程序能够报告它单独分配和使用的内存量.
我的Delphi 2009程序中是否有任何方法可以调用Windows函数或某些FastMM函数来查找我的程序单独分配的内存?
重新审视我的问题,我现在已经通过@apenwarr更改了我对GetMemoryManagerState答案的接受答案.它产生了与我以前使用的GetHeapStatus函数(现已弃用)相同的结果,而GetProcessMemoryInfo.WorkingSetSize给出了非常不同的结果.
您可以从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;
关于这种方法的最好的事情是它被严格跟踪:当你分配内存时,它会上升,当你释放内存时,它会立即下降相同的数量.我在运行每个单元测试之前和之后使用它,所以我可以判断哪个测试正在泄漏内存(例如).
来自我的一篇老博文.
想知道你的程序使用了多少内存?这个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中找到所有这些值.