Phys gibt den Speicher vom gesamten Windows an ... Was aber in deinem Programm, also im "virtuellen" Speicher, belegt/frei ist und was du demnach wirklich verwenden kannst, ist damit nicht ausgesagt!
Und du forderst "zusammenhängenden" Speicher von 256 MB + 8 Byte an.
Wenn kein so großer zusammenhängender Block mehr da ist, dann *peng*.
Übeall fein verteilt liegt genutzter Arbeitsspeicher ( Heap? ), der/die Stacks, die gemappten Resourcen, und Programmcodes der EXE und DLLs rum.
Du könntest dir höchstens eine Memory-Map erstellen, wo du alle freien Stellen anzeigst.
PS: OK, bei der Größegibt dir FastMM einen Big-Block, welcher direkt von Windows geholt wird (VirtualAlloc), aber bei kleineren Speicherblöcken, geht das auf Medium- und Small-Blocks, welche immer in Gruppen bei Windows reserviert werden, wovon nicht alle verwendet sein müssen ... diese sind also laut Windows belegt, aber FastMM kann sie dennoch ans Programm weitergeben, weil sie eben nur "vorbestellt"/reserviert sind.
Tipp:
GlobalMemoryStatusEx
Ach ja, und du schreibst nichts in diesen Speicher rein, das merkt Windows und verknüpft dieses nicht unbedingt sofort mit "echtem" Speicher ... erst wenn das wirklich verwendet wird.
Delphi-Quellcode:
type
TIntArray = array[0..0] of Integer;
PIntArray = ^TIntArray;
var
i, i2 : Integer;
begin
for i := 0 to 100 do
begin
Setlength(F[i], 1024*1024*256);
for i2 := 1024*1024*256 div 1024 - 1 downto 0 do
PIntArray(@F[i])[i2 * 1024 div SizeOf(Integer)] := 666;
GlobalMemoryStatus(M);
(man könnte och mit FillChar und Co. jedes Byte einzeln füllen, aber Windows verwaltet den Speicher sowieso nicht byteweise ... 4 KB und 64 KB)