FastMM: общая выделенная память - PullRequest
6 голосов
/ 29 марта 2011

Как я могу получить общий объем памяти, выделенный FastMM?

Я пробовал это:

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

Правильно ли?это возвращает что-то странное.Это в 5 раз меньше значения, которое я вижу в диспетчере задач Windows.Я считаю, что объем памяти, выделенный приложением Delphi, равен выделенной памяти FastMM плюс некоторые системные издержки.Я не прав?

Ответы [ 4 ]

4 голосов
/ 29 марта 2011

Используйте это:

//------------------------------------------------------------------------------  
// 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;
4 голосов
/ 29 марта 2011

Вы сравниваете яблоки и апельсины.

Память FastMM - это нетто-память, выделенная через FastMM.

Это не включает, по крайней мере, следующее:

  • FastMM накладные расходы
  • Затраты Windows на блоки, выделенные FastMM от вашего имени
  • Затраты Windows на вещи, не выделенные FastMM (например, пространство, занимаемое DLL в вашем рабочем пространстве)
  • для приложений с графическим интерфейсом: накладные расходы на GDI, GDI +, DirectX, OpenGL и другое хранилище для визуальных объектов, выделенных от вашего имени.

- Йерун

3 голосов
/ 29 марта 2011

Для памяти процесса используйте это:

//------------------------------------------------------------------------------
// 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;
2 голосов
/ 29 апреля 2015

Я тоже сталкивался с такой ситуацией:

В любом случае он возвращает что-то странное.Это в 5 раз меньше значения, которое я вижу в диспетчере задач Windows.Я считаю, что объем памяти, выделенный приложением Delphi, равен выделенной памяти FastMM плюс некоторые системные издержки.Я не прав?

и потратил впустую несколько часов, пытаясь выяснить, где находится вся память.По словам диспетчера задач, мое приложение занимало 170 Мб, но статистика FastMM показала общий размер выделенных блоков ~ 13 Мб:

12565K Allocated
160840K Overhead
7% Efficiency

(выдержка из вывода процедуры FastMM LogMemoryManagerStateToFile).Наконец я понял, что эти огромные издержки вызваны режимом FullDebug.Он сохраняет следы стека для каждого выделения, поэтому, если у вас выделено много крошечных блоков памяти (у моего приложения были объекты UnicodeString x 99137, Unknown x 17014 и ~ 10000 XML), накладные расходы становятся пугающими.Удаление режима FullDebug вернуло потребление памяти к нормальным значениям.

Надеюсь, это кому-нибудь поможет.

...