![]() |
Wieviel Speicher kann ich nutzen?
Hallo,
um einige Dinge zu testen (siehe ![]() Sobald der String größer als 1200 MB ist, fliegt mir eine Speicher-Exception um die Ohren. Sollte ich unter Win32 nicht mindestens 1,5 GB Speicher verwenden können? Das kann man übrigens leicht ausprobieren:
Delphi-Quellcode:
Gruß
procedure TForm1.Button1Click(Sender: TObject);
var P: PAnsiChar; C: Integer; MBSize: Integer; begin MBSize := 1201; // <- 1200 funktioniert noch P := nil; try P := StrAlloc(MBSize * 1024 * 1024 + 1); // Mit Blödsinn füllen for C := 0 to MBSize * 1024 * 1024 do (P + C)^ := 'A'; finally StrDispose(P); end; end; xaromz |
Re: Wieviel Speicher kann ich nutzen?
2 GB um genau zu sein. Aber deine Anwendung selber braucht ja auch noch was. ;)
|
Re: Wieviel Speicher kann ich nutzen?
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: Wieviel Speicher kann ich nutzen?
Guck im Taskmanager nach.
|
Re: Wieviel Speicher kann ich nutzen?
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: Wieviel Speicher kann ich nutzen?
Wuird dran liegen dass der Speicherbereich eventuell fragmentiert ist und nicht ehr so viel Speicher in einem Stück alloziiert werden kann.
|
Re: Wieviel Speicher kann ich nutzen?
Hallo,
Zitat:
Außerdem ist das Problem auch nach einem Neustart des Rechners noch da. Und wenn es an Fragmentierung läge, wäre es doch ein komischer Zufall, wenn wieder genau 1200 MB am Stück verfügbar wären. Ich hab natürlich übersehen, dass auch der eigene Adressraum fragmentiert werden kann. Ich bin nur etwas verwundert, wie stark fragmentiert dieser bereits kurz nach dem Start der Anwendung ist. Kann eigentlich irgendjemand das Problem nachvollziehen? Gruß xaromz |
Re: Wieviel Speicher kann ich nutzen?
Ich habe den Code ebenfalls probiert. Und bin rel. verwundert.
In meiner Mühle stecken 2 GB. wovon 1,4 definitiv frei sind. ich kann nicht mal die 1200 Alloziieren. dann habe ich es mit 1000 versucht, hat geklappt. dann mit 1199 nicht geklappt. dann mit 1050 - nicht geklappt. und dann wieder mit 1000 AUCH NICHT MEHR! irgendwie ist das ganze sehr komisch. Und meines Wissens müsste doch die Speicherverwaltung, wenn ich z.B. "nur" 2GB Speicher habe aber 3 Alloziiere den Rest in die Auslagerungsdatei schreiben? |
Re: Wieviel Speicher kann ich nutzen?
wenn du mit obigem Code Memory allozieren möchtest, müsste ja im virtuellen Adressraum die gesamte Grösse zusammenhängend frei sein... da jedoch teilweise stark verzettelt kleine Bereiche bereits belegt sind, ist es glücksache, wie gross der grösste zusammenhängende freie Speicherblock noch ist...
schau dir mal mittels folgendem Code den virtuellen Adressraum deines Prozesses an:
Delphi-Quellcode:
bei mir war der grösste "Free"-Block ca. 1.2 GB...
Procedure VMdump();
Var Base : Pointer; MBI : TMemoryBasicInformation; State : String; TypeS : String; begin Base:=Nil; While (VirtualQuery(Base,MBI,SizeOf(MBI)) > 0) Do Begin Case MBI.State Of MEM_COMMIT : State:='Commit'; MEM_FREE : State:='Free'; MEM_RESERVE : State:='Reserve'; Else State:='-'; end; Case MBI.Type_9 Of MEM_IMAGE : TypeS:='Image'; MEM_MAPPED : TypeS:='Mapped'; MEM_PRIVATE : TypeS:='Private'; Else TypeS:='-'; end; WriteLn(Format('%p..%.8x %.7d %-7s %-7s',[MBI.BaseAddress,LongWord(MBI.BaseAddress) + MBI.RegionSize - 1,MBI.RegionSize div 1024,State,TypeS])); Base:=Pointer(LongWord(MBI.BaseAddress) + MBI.RegionSize); end; end; wenn du nun in einer Schlaufe kleinere Blöcke allozieren würdest, wären sicherlich gegen 2 GB möglich... |
Re: Wieviel Speicher kann ich nutzen?
Zitat:
Zitat:
|
Re: Wieviel Speicher kann ich nutzen?
Vermutlich dass der Adressraum zwischen den 2 Adressen (die ersten zwei Werte) eben 1480896 kB (?) groß ist ;)
air |
Re: Wieviel Speicher kann ich nutzen?
Zitat:
Code:
im virtuellen Memory an der Adresse 00AC0000 bis 5B0EFFFF liegt ein freier Bereich mit der Länge von 1'680'896 kB (1.6 GB)...
Adressbereich Grösse (kB) Status Type
00AC0000..5B0EFFFF 1480896 Free - |
Re: Wieviel Speicher kann ich nutzen?
Hallo,
nach Betrachten des virtuellen Adressraums wird mir einiges klarer. Es sind tatsächlich nur ca. 1200 MB zusammenhängend frei. Bleibt die Frage, warum sind mittendrin überall 4, 8, 16,... Bytes reserviert? Geht das nicht geschickter? Gruß xaromz |
Re: Wieviel Speicher kann ich nutzen?
Zitat:
obwohl: ob es überhaupt einen sinnvollen Grund gibt, 1 GB am Stück im RAM zu halten, würde ich bezweifeln... da würde sich ein File-Mapping im Swap-File anbieten und nach Bedarf Segment-weise in den virtuellen Adressraum einblenden lassen.... |
Re: Wieviel Speicher kann ich nutzen?
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Re: Wieviel Speicher kann ich nutzen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz