xe2 versiones que para full ex8 embarcadero creadores delphi delphi-2007

delphi - versiones - ¿Por qué el uso de la memoria de mi programa no vuelve a la normalidad después de liberar la memoria?



que es delphi 2010 (3)

¿Cómo funciona getmem / malloc / free?

Heap Allocator - Según lo utilizado por malloc ...

1) Asigna internamente grandes porciones (normalmente 64 K hasta 1 Megabyte) de memoria y luego subdivide los fragmentos para darle los objetos y cadenas de 100byte y 200byte en el programa. Cuando libera memoria, todo lo que sucede es el lugar desde el que se asignó en el búfer interno o el fragmento se marca como libre. ¡NADA REALMENTE SUCEDE!

2) Así que puedes pensar en el HEAP como una lista de grandes porciones de memoria, y todos los objetos en tu programa son solo pequeñas partes de esos fragmentos.

3) Los grandes fragmentos internos de la memoria solo se liberan cuando se liberan todos los objetos que están dentro de ellos, por lo que el caso habitual es que cuando liberas algún objeto no pasa nada, excepto que algunos bits se marcan como disponibles.

Esa es una descripción bastante ingenua del sistema Heap, pero la mayoría funciona de manera similar, pero optimiza mucho más que eso. Pero su pregunta es por qué la memoria no baja y la respuesta es porque nada se libera realmente. Las páginas internas de la memoria se conservan para la siguiente llamada a "nuevo" o "malloc", etc.

PÓNGALO

HEIDE INTERIOR ES UN ENORME BLOQUE DE 100Kb

You call "malloc(1000)" or "getmem(1000)" to get a 1K block of memory.

Entonces, todo lo que ocurre es que el bloque de memoria de 1K se toma del bloque de memoria de 100 kb dejando 99K de memoria disponible en ese bloque. Si continúa llamando malloc o getmem, seguirá dividiendo el bloque más grande hasta que necesite otro bloque más grande.

Cada pequeño bloque de memoria asignado con una llamada a malloc o getmem en realidad obtiene aproximadamente 16 o 24 bytes adicionales (dependiendo del asignador) de memoria extra. Esa memoria es bits que el asignador utiliza para saber qué se asigna y también dónde se asigna.

considerar la siguiente aplicación de muestra

program TestMemory; {$APPTYPE CONSOLE} uses PsAPI, Windows, SysUtils; function GetUsedMemoryFastMem: cardinal; var st: TMemoryManagerState; sb: TSmallBlockTypeState; begin GetMemoryManagerState(st); result := st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize; for sb in st.SmallBlockTypeStates do begin result := result + sb.UseableBlockSize * sb.AllocatedBlockCount; end; end; function GetUsedMemoryWindows: longint; var ProcessMemoryCounters: TProcessMemoryCounters; begin Result:=0; ProcessMemoryCounters.cb := SizeOf(TProcessMemoryCounters); if GetProcessMemoryInfo(GetCurrentProcess(), @ProcessMemoryCounters, ProcessMemoryCounters.cb) then Result:= ProcessMemoryCounters.WorkingSetSize else RaiseLastOSError; end; procedure Test; const Size = 1024*1024; var P : Pointer; begin GetMem(P,Size); Writeln(''Inside''); Writeln(''FastMem ''+FormatFloat(''#,'', GetUsedMemoryFastMem)); Writeln(''Windows ''+FormatFloat(''#,'', GetUsedMemoryWindows)); Writeln(''''); FreeMem(P); end; begin Writeln(''Before''); Writeln(''FastMem ''+FormatFloat(''#,'', GetUsedMemoryFastMem)); Writeln(''Windows ''+FormatFloat(''#,'', GetUsedMemoryWindows)); Writeln(''''); Test; Writeln(''After''); Writeln(''FastMem ''+FormatFloat(''#,'', GetUsedMemoryFastMem)); Writeln(''Windows ''+FormatFloat(''#,'', GetUsedMemoryWindows)); Writeln(''''); Readln; end.

los resultados devueltos por la aplicación son

Before FastMem 1.844 Windows 3.633.152 Inside FastMem 1.050.612 Windows 3.637.248 After FastMem 2.036 Windows 3.633.152

Quiero saber por qué los resultados del uso de la memoria son diferentes en el Before y el After :


Cualquier administrador de memoria (incluido FastMM) incurre en algunos gastos generales, de lo contrario, Delphi podría haber utilizado la administración de memoria de Windows.

La diferencia que observa es la sobrecarga:

  • estructuras que FastMM utiliza para realizar un seguimiento del uso de la memoria,
  • piezas de memoria que FastMM aún no regresó a la administración de memoria de Windows para optimizar asignaciones de memoria similares en el futuro.

Porque el administrador de memoria está haciendo cosas inteligentes en segundo plano para acelerar el rendimiento.