![]() |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
![]() |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Ich habe erstmal Benedikt Magnus' Anregung aufgegriffen und die Größe der 7 Bitmaps ermittelt:
Delphi-Quellcode:
. Das ergab ungefähr 370 MB. Dann habe ich Bambinis Anregung umgesetzt, das ergab einen Wert von ca. 2,7 MB. Der Taskmanager zeigt ca. 500 MB. Das verstehe, wer will.
SizeOf(BMP) + Bmp.Width * Bmp.Height * (24 div 8)
Die Umsetzung von Zacherls Hinweis wird etwas aufwändiger und dauern. |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Beispiel: Wenn ich ein Auto habe mit im Fahrzeugschein eingetragener Länge von 4,00 Meter: Ist das Auto 4,00 Meter lang oder ist es kürzer, weil ein LKW-Fahrer hinten draufgefahren ist? Memory-Leaks sind nicht der Normalfall. Redet das niemanden ein! ![]() In PSAPI.PAS:
Delphi-Quellcode:
_PROCESS_MEMORY_COUNTERS = record
cb: DWORD; PageFaultCount: DWORD; PeakWorkingSetSize: SIZE_T; WorkingSetSize: SIZE_T; QuotaPeakPagedPoolUsage: SIZE_T; QuotaPagedPoolUsage: SIZE_T; QuotaPeakNonPagedPoolUsage: SIZE_T; QuotaNonPagedPoolUsage: SIZE_T; PagefileUsage: SIZE_T; PeakPagefileUsage: SIZE_T; end; |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Wenn du also eine Pauschale für das Programm selbst nimmst und dir merkst, wie viele MB an Bitmaps bisher maximal gleichzeitig im Speicher lagen, müsstest du etwas erhalten, dass garantiert unter dem Wert im Taskmanager liegt (und bei voller oder konstanter Auslastung an Bitmaps sogar nahe am Taskmanager). |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
![]() |
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Zitat:
Zitat:
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
Zitat:
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Zitat:
![]() Außerdem adressiert die diese API wieder nicht das eigentliche Problem. Also nochmal: Die großen Bitmaps erfordern große zusammenhängende Speicherblöcke im virtuellen Adressraum. Die Pages auszulagern entlastet aber nicht den virtuellen Adressraum, sondern nur den physikalischen Speicher. Deshalb kann ich auch nur nochmal empfehlen die ganze Herangehensweise mit Messen des aktuell benutzten Speichers so schnell wie möglich zu vergessen. Man kann einfach nicht zuverlässig vorhersagen ab welcher Größe ein
Delphi-Quellcode:
auftreten wird. Wie gesagt kann es sogar passieren, dass dein Prozess noch kaum Arbeitsspeicher verwendet, aber dank Fragmentierung kein genügend großer zusammenhängender Block verfügbar ist. Kannst du ganz leicht testen, indem du mal 1 GiB Speicher am Stück mit
EOutOfMemory
Delphi-Quellcode:
anforderst. Dieser Aufruf wird bei einem 32-Bit Programm in den meisten Fällen direkt scheitern. 1 GiB in mehreren kleinen 10 MiB Blöcken anzufordern, wird dahingegen sehr wahrscheinlich Erfolg haben. Auch wirst du merken, dass dein Bitmap Tool als 64-Bit Kompilat ohne Änderung vermutlich sehr viele Bitmaps mehr laden kann. Schlussfolgerung ist, dass nicht der physikalische RAM das Limit darstellt, sondern der virtuelle Adressraum.
GetMem
|
AW: Speicherlast des Programms mittels GetMemoryManagerState - komischer Wert
Das mit den Forms mache ich teilweise auch so. Ich erstelle komplexe Formulare erst wenn sie wirklich benötigt werden.
Das verschnellert den Programmstart und hält den Speicherverbrauch ein wenig niedriger. Hat einzig den Nachteil der Usability im Sinne von "Wenn ich da drauf klicke, soll sofort was passieren" - ist dann eben nicht der Fall. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 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