2011-03-29 12 views
5

Come è possibile ottenere la quantità totale di memoria allocata da FastMM?FastMM: memoria totale allocata

Ho provato che:

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

È vero?

In ogni caso restituisce qualcosa di strano. È 5 volte meno di un valore che posso vedere nel task manager di Windows. Credo che la quantità di memoria allocata da un'applicazione Delphi sia uguale alla memoria allocata da FastMM più un sovraccarico del sistema. Ho sbagliato?

+0

A cosa stai comparando da Task Manager? Diteci il nome della colonna, quindi possiamo dirvi perché i vostri risultati sono corretti. –

+0

GetTotalAllocatedMemory restituisce 13,973,184/la colonna "Mem Usage" di taskmanager mostra ora 154,912K –

+0

Cosmin indica a quale colonna in Task Manager si sta confrontando il risultato di GetTotalAllocatedMemory? – Remko

risposta

4

Utilizzare questa:

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

BTW, questo ti darà la memoria allocata solo da FastMM. Vedere un'altra risposta per ottenere l'utilizzo della memoria di processo. – Misha

4

Stai confrontando mele e arance.

La memoria di FastMM è l'utilizzo netto della memoria allocata tramite FastMM.

Questo non include almeno questi:

  • FastMM testa
  • di Windows sovraccarico di blocchi allocati dal FastMM a vostro nome
  • di Windows sovraccarico di cose non assegnate dalla FastMM (come lo spazio occupato da DLL nel tuo spazio di processo)
  • per le applicazioni GUI: sovraccarico di GDI, GDI +, DirectX, OpenGL e altra memoria per oggetti visivi allocati per tuo conto.

--jeroen

+0

hai dimenticato il più grande bit che è la memoria di Windows, oggetti gdi ecc. –

+0

che dipende se la tua app è o meno una GUI -> –

3

Per l'utilizzo della memoria processo di questo:

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

Cosa fa CsiGetProcessHandle? –

+0

Un wrapper attorno all'API di Windows chiama GetCurrentProcess – Misha

+1

-1 Perché PageFileUsage NON è l'utilizzo della memoria corrente. Vedi http://blogs.technet.com/b/perfguru/archive/2008/01/08/explanation-of-pagefile-usage-as-reported-in-the-task-manager.aspx –

2

ho anche hanno affrontato questa situazione:

Comunque ret urna qualcosa di strano È 5 volte inferiore a un valore che posso vedere nel task manager di Windows. Credo che la quantità di memoria allocata da un'applicazione Delphi sia uguale alla memoria assegnata da FastMM più un sovraccarico del sistema. Ho sbagliato?

e sprecato diverse ore cercando di scoprire dov'è tutta la memoria. La mia app occupava 170 MB in base alla Task manager, ma le statistiche del FastMM stava mostrando dimensione totale di blocchi allocati ~ 13 Mb:

12565K Allocated 
160840K Overhead 
7% Efficiency 

(estratto da FastMM LogMemoryManagerStateToFile uscita procedura). Alla fine ho capito che questo enorme sovraccarico è causato dalla modalità FullDebug. Mantiene stacktraces per ogni allocazione, quindi se hai molti piccoli blocchi di memoria allocati (la mia app ha UnicodeString x 99137, Unknown x 17014 e ~ 10000 di oggetti Xml) il sovraccarico diventa spaventoso. La rimozione della modalità FullDebug ha restituito il consumo di memoria ai suoi valori normali.

Spero che questo aiuti qualcuno.

+0

Che tipo di efficienza si ottiene rimuovendo la modalità FullDebug? Sono passato dal 5% al ​​16%, il che è ancora inaccettabile. IMHO ... –

+0

@SlashV Ho ottenuto 1627K allocati, 4771K Overhead, 25% di efficienza. IDK se è buono perché ho un sacco di piccoli pezzi di memoria là '617652 byte: TXmlAttr x 7353 (84 byte medio), 429708 byte: UnicodeString x 9315 (46 byte avg.), 190860 byte: Unknown x 2861 (66 byte avg.), 161704 byte: TXmlElement x 1394 (116 byte avg.), 62972 byte: TXmlAttrList x 1211 (52 byte avg.) 'ed è ovviamente un caso difficile per l'efficienza. – Fr0sT

+0

Ho capito che per me la bassa efficienza era semplicemente dovuta alla memoria rilasciata ma non restituita al sistema operativo. Ad esempio, gli oggetti temporanei sono stati creati e rilasciati prima di esaminare l'utilizzo generale. –