7

如何获得 FastMM 分配的内存总量?

我试过了:

function GetTotalAllocatedMemory: Cardinal;
var
  MMState: TMemoryManagerState;
begin
  GetMemoryManagerState(MMState);
  Result := MMState.TotalAllocatedMediumBlockSize + MMState.TotalAllocatedLargeBlockSize;
end;

这是正确的吗?

无论如何,它会返回一些奇怪的东西。它比我在 Windows 任务管理器中看到的值小 5 倍。我相信 Delphi 应用程序分配的内存量等于 FastMM 分配的内存加上一些系统开销。我错了吗?

4

4 回答 4

4

你在比较苹果和橘子。

FastMM 内存是通过 FastMM 分配的内存的净使用量。

这至少不包括这些:

  • FastMM 开销
  • FastMM 代表您分配的块的 Windows 开销
  • FastMM 未分配的事物的 Windows 开销(例如 DLL 在您的进程空间中占用的空间)
  • 对于 GUI 应用程序:代表您分配的可视对象的 GDI、GDI+、DirectX、OpenGL 和其他存储的开销。

——杰伦

于 2011-03-29T10:09:32.353 回答
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;
于 2011-03-29T10:40:10.373 回答
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;
于 2011-03-29T10:43:52.963 回答
3

我也遇到过这种情况:

无论如何,它会返回一些奇怪的东西。它比我在 Windows 任务管理器中看到的值小 5 倍。我相信 Delphi 应用程序分配的内存量等于 FastMM 分配的内存加上一些系统开销。我错了吗?

并浪费了几个小时试图找出所有内存的位置。根据任务管理器,我的应用程序占用了 170 Mb,但 FastMM 的统计数据显示已分配块的总大小约为 13 Mb:

12565K Allocated
160840K Overhead
7% Efficiency

(摘自 FastMMLogMemoryManagerStateToFile过程输出)。最后我意识到这个巨大的开销是由 FullDebug 模式引起的。它为每次分配保留堆栈跟踪,因此如果您分配了许多微小的内存块(我的应用程序有 UnicodeString x 99137、Unknown x 17014 和 ~10000 个 Xml 对象),开销就会变得可怕。删除 FullDebug 模式会将内存消耗恢复到正常值。

希望这对某人有所帮助。

于 2015-04-29T16:09:48.457 回答