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)
关于这种方法的最好的事情是它被严格跟踪:当你分配内存时,它会上升,当你释放内存时,它会立即下降相同的数量.我在运行每个单元测试之前和之后使用它,所以我可以判断哪个测试正在泄漏内存(例如).
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记录包括:
您可以在任务管理器或Process Explorer中找到所有这些值.
归档时间: |
|
查看次数: |
30293 次 |
最近记录: |