Question

Comment pourrais-je obtenir la quantité totale de mémoire, qui est allouée par Fastmm?

J'ai essayé ça:

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

Est-ce correct?

Quoi qu'il en soit, cela renvoie quelque chose d'étrange. Il est 5 fois inférieur à une valeur que je peux voir dans Windows Task Manager. Je crois que la quantité de mémoire allouée par une application Delphi est égale à la mémoire allouée FastMM plus une surcharge système. Ai-je tort?

Était-ce utile?

La solution

Utilisez ceci:

//------------------------------------------------------------------------------  
// 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;

Autres conseils

Vous comparez les pommes et les oranges.

La mémoire Fastmm est une utilisation de la mémoire allouée via Fastmm.

Cela n'inclut pas au moins ces derniers:

  • Fastmm au-dessus
  • Windows Overhead des blocs alloués par Fastmm en votre nom
  • Windows Overhead de choses non allouées par Fastmm (comme l'espace occupé par DLL dans votre espace de processus)
  • Pour les applications GUI: les frais généraux de GDI, GDI +, DirectX, OpenGL et d'autres stockages pour les objets visuels alloués en votre nom.

- Jeroen

Pour la mémoire de processus, utilisez ceci:

//------------------------------------------------------------------------------
// 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;

J'ai également fait face à cette situation:

Quoi qu'il en soit, cela renvoie quelque chose d'étrange. Il est 5 fois inférieur à une valeur que je peux voir dans Windows Task Manager. Je crois que la quantité de mémoire allouée par une application Delphi est égale à la mémoire allouée FastMM plus une surcharge système. Ai-je tort?

et a perdu plusieurs heures en essayant de savoir où se trouve toute la mémoire. Mon application occupait 170 Mo selon le gestionnaire de tâches, mais les statistiques de Fastmm affichent la taille totale des blocs alloués ~ 13 Mo:

12565K Allocated
160840K Overhead
7% Efficiency

(Extrait de Fastmm LogMemoryManagerStateToFile Sortie de procédure). Enfin, j'ai réalisé que cette énorme surcharge est causée par le mode Fulldebug. Il conserve des stacktraces pour chaque allocation, donc si vous avez de nombreux blocs de mémoire alloués (mon application avait un cocodestring x 99137, inconnu x 17014 et ~ 10000 d'objets XML), la surcharge devient effrayante. La suppression du mode FullDebug a renvoyé la consommation de mémoire à ses valeurs normales.

J'espère que cela aide quelqu'un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top