2011-03-29 31 views
5

¿Cómo podría obtener la cantidad total de memoria asignada por FastMM?FastMM: Total de memoria asignada

lo he intentado:

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

¿Es correcto?

De todos modos, devuelve algo extraño. Es 5 veces menos que un valor que puedo ver en el administrador de tareas de Windows. Creo que la cantidad de memoria asignada por una aplicación Delphi es igual a la memoria asignada a FastMM más cierta sobrecarga del sistema. ¿Me equivoco?

+0

¿Qué estás comparando con el Administrador de tareas? Díganos el nombre de la columna, para que podamos decirle por qué sus resultados son correctos. –

+0

GetTotalAllocatedMemory returns 13,973,184/La columna "Uso de Mem" de taskmanager ahora muestra 154,912 K –

+0

Cosmin significa a qué columna del Administrador de tareas comparas el resultado de GetTotalAllocatedMemory? – Remko

Respuesta

4

Utilice esta:

//------------------------------------------------------------------------------ 
// 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, esto le dará la memoria asignada solo por FastMM. Vea otra respuesta para obtener el uso de la memoria de proceso. – Misha

4

Estás viendo manzanas y naranjas.

La memoria FastMM es el uso neto de la memoria asignada a través de FastMM.

Esto no incluye, al menos, los siguientes:

  • sobrecarga FastMM
  • de Windows por encima de los bloques asignados por FastMM en su nombre
  • de Windows por encima de lo que no asignados por FastMM (como el espacio ocupado por DLL en su espacio de proceso)
  • para aplicaciones de GUI: gastos generales de GDI, GDI +, DirectX, OpenGL y otro almacenamiento para objetos visuales asignados en su nombre.

--jeroen

+0

ha olvidado el bit más grande que es la memoria propiedad de windows, objetos gdi, etc. –

+0

que depende de si su aplicación es una GUI o no; -> –

3

Para el uso de memoria de proceso siguiente:

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

¿Qué hace CsiGetProcessHandle? –

+0

Un contenedor alrededor de la llamada API de Windows GetCurrentProcess – Misha

+1

-1 Porque PageFileUsage NO es el uso actual de la memoria. Ver http://blogs.technet.com/b/perfguru/archive/2008/01/08/explanation-of-pagefile-usage-as-reported-in-the-task-manager.aspx –

2

también se han enfrentado a esta situación:

De todos modos, ret urnas algo extraño. Es 5 veces menos que un valor que puedo ver en el administrador de tareas de Windows. Creo que la cantidad de memoria asignada por una aplicación Delphi es igual a la memoria asignada de FastMM más algunos gastos generales del sistema. ¿Me equivoco?

y perdí varias horas tratando de averiguar dónde está toda la memoria. Mi aplicación ocupado 170 Mb según el gerente de tareas, pero las estadísticas de FastMM se muestra el tamaño total de bloques asignados ~ 13 Mb:

12565K Allocated 
160840K Overhead 
7% Efficiency 

(extracto de FastMM LogMemoryManagerStateToFile procedimiento de salida). Finalmente me di cuenta de que esta sobrecarga enorme es causada por el modo FullDebug. Mantiene stacktraces para cada asignación así que si tienes asignados muchos pequeños bloques de memoria (mi aplicación tenía UnicodeString x 99137, Unknown x 17014 y ~ 10000 de objetos Xml) la sobrecarga se vuelve aterradora. La eliminación del modo FullDebug devolvió el consumo de memoria a sus valores normales.

Espero que esto ayude a alguien.

+0

¿Qué tipo de eficiencia obtiene al eliminar el modo FullDebug? Pasé de 5% a 16%, lo cual es aún inaceptablemente pobre. En mi humilde opinión ... –

+0

@SlashV obtuve '1627K asignado, 4771K de gastos generales, 25% de eficiencia'. IDK si es bueno porque tengo muchas pequeñas piezas de memoria allí '617652 bytes: TXmlAttr x 7353 (84 bytes avg.), 429708 bytes: UnicodeString x 9315 (46 bytes avg.), 190860 bytes: Desconocido x 2861 (66 bytes avg.), 161704 bytes: TXmlElement x 1394 (116 bytes avg.), 62972 bytes: TXmlAttrList x 1211 (52 bytes avg.) 'y obviamente es un caso difícil para la eficiencia. – Fr0sT

+0

Descubrí que, para mí, la baja eficiencia se debía simplemente a la liberación de memoria pero no al SO. es decir, se crearon y soltaron objetos temporales antes de ver el uso general. –

Cuestiones relacionadas