Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Freier Speicher in Delphiprogrammen ermitteln?

  Alt 12. Jul 2012, 13:02
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: MSDN-Library durchsuchenGlobalMemoryStatusEx




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)
$2B or not $2B

Geändert von himitsu (12. Jul 2012 um 13:16 Uhr)
  Mit Zitat antworten Zitat