我如何获得由FastMM分配的内存总量?
我试过了:
function GetTotalAllocatedMemory: Cardinal;
var
MMState: TMemoryManagerState;
begin
GetMemoryManagerState(MMState);
Result := MMState.TotalAllocatedMediumBlockSize + MMState.TotalAllocatedLargeBlockSize;
end;
这是对的吗?
无论如何它会返回一些奇怪的东西。它比我在Windows任务管理器中看到的值少5倍。我相信Delphi应用程序分配的内存量等于FastMM分配的内存加上一些系统开销。我错了吗?
答案 0 :(得分:4)
您正在比较苹果和橘子。
FastMM内存是通过FastMM分配的内存的netto使用。
这至少包含以下内容:
- 的Jeroen
答案 1 :(得分:4)
使用此:
//------------------------------------------------------------------------------
// CsiGetApplicationMemory
//
// Returns the amount of memory used by the application (does not include
// reserved memory)
//------------------------------------------------------------------------------
function CsiGetApplicationMemory: Int64;
var
lMemoryState: TMemoryManagerState;
lIndex: Integer;
begin
Result := 0;
// get the state
GetMemoryManagerState(lMemoryState);
with lMemoryState do begin
// small blocks
for lIndex := Low(SmallBlockTypeStates) to High(SmallBlockTypeStates) do
Inc(Result,
SmallBlockTypeStates[lIndex].AllocatedBlockCount *
SmallBlockTypeStates[lIndex].UseableBlockSize);
// medium blocks
Inc(Result, TotalAllocatedMediumBlockSize);
// large blocks
Inc(Result, TotalAllocatedLargeBlockSize);
end;
end;
答案 2 :(得分:3)
对于进程内存使用此:
//------------------------------------------------------------------------------
// CsiGetProcessMemory
//
// Return the amount of memory used by the process
//------------------------------------------------------------------------------
function CsiGetProcessMemory: Int64;
var
lMemoryCounters: TProcessMemoryCounters;
lSize: Integer;
begin
lSize := SizeOf(lMemoryCounters);
FillChar(lMemoryCounters, lSize, 0);
if GetProcessMemoryInfo(CsiGetProcessHandle, @lMemoryCounters, lSize) then
Result := lMemoryCounters.PageFileUsage
else
Result := 0;
end;
答案 3 :(得分:2)
我也遇到过这种情况:
无论如何它会返回一些奇怪的东西。它比一个值小5倍 我可以在Windows任务管理器中看到。我相信的数量 由Delphi应用程序分配的内存等于FastMM分配 内存加上一些系统开销。我错了吗?
浪费了几个小时试图找出所有内存的位置。根据任务经理的说法,我的应用程序占用了170 Mb,但FastMM的统计数据显示了已分配块的总大小~13 Mb:
12565K Allocated
160840K Overhead
7% Efficiency
(摘自FastMM LogMemoryManagerStateToFile
过程输出)。最后我意识到这个巨大的开销是由FullDebug模式引起的。它为每个分配保留堆栈跟踪,所以如果你分配了许多微小的内存块(我的应用程序有UnicodeString x 99137,Unknown x 17014和~10000个Xml对象),开销变得可怕。删除FullDebug模式会将内存消耗恢复为正常值。
希望这有助于某人。