![]() |
Anwendung frisst auf Windows 7 Arbeitsspeicher
Hallo,
ich habe eine 32 Bit Anwendung mit Delphi 11.0 kompiliert und wenn ich die Anwendung laufen lassen verbraucht sie mit laufe der Zeit immer mehr Speicher. Jedoch ist das Verhalten unter Windows 10 ein anderes als unter Windows 7. Während bei Windows 10 der Speicher irgendwann freigeben wird, wächst die Anwendung unter Windows 7 ununterbrochen weiter, bis irgendwann das Limit erreicht wird und dann die Anwendung abstürzt. Bei Windows 10 wächst die Anwendung von 3,5 MB auf über 60 MB an und dann wird auf einmal alles wieder freigeben und die Anwendung ist wieder nur wenige MB groß. Die Anwendung ist ein kleines Tool was im System-Tray läuft und die ganze Zeit im Hintergrund ein Verzeichnis überwacht ob dort neue Dateien liegen, sind Dateien vorhanden werden die Dateien eingelesen und verarbeitet. In der Anwendung wird mit verschiedenen Threads gearbeitet. Ich habe den gesamten Quelltext überprüft als auch mit FastMM4 versucht herauszufinden, ob und wo das Problem ist. Es kam nur einmal vor das ich nachdem Beenden der Abwendung in der Entwicklungsumgebung eine Meldung von FastMM4 kam, das es ein Speicherleck geben würde. Jedoch ohne Hinweis wo und an welcher Stelle das passiert ist.
Code:
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):
21 - 36 bytes: System.SysUtils.EListError x 5 101 - 116 bytes: UnicodeString x 5 Ich weiß natürlich das man heutzutage kein Windows 7 mehr einsetzen sollte, aber es handelt sich hier bei um einen speziellen Rechner bei einem Kunden. Das aber auch unter Windows 10 der Speicherverbrauch so "hoch" ist, verstehe ich nicht ganz. Vielleicht hat hier jemand einen Tipp, mit welchen Methoden man der Ursache auf den Grund gehen könnte. Leider kann ich aus Gründen hier nicht den gesamten Quelltext der Anwendung einstellen. Die Anwendung ist über viele Jahre weiter entwickelt worden und daher auch mit unterschiedlichen Delphi Versionen kompiliert worden und plötzlich zeigt sich dieses Merkwürdige Verhalten. |
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Es fehlt ein Try-Finally Block. Vermutlich erzeugst Du irgendwo eine Liste und gibst diese nicht frei wenn eine Exception auftritt
|
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Es gibt zwei Möglichkeiten:
Speicher wird immer weiter reserviert und gar nicht mehr freigegeben. Das sieht man dann in den FastMM-Logs. Die muss man nur aktivieren, dann bekommt man ein Log mit Stacktrace usw., so dass man die Speicherlecks leicht findet. Die andere Möglichkeit ist, dass der Speicher beim Beenden durchaus wieder freigegeben wird, aber zur Laufzeit nicht. Das siehst du dann nicht in solchen Logs. Da helfen dann Speicheranalyse-Tools wie TMS MemInsight: ![]() |
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Ein Speicherleck scheint mir nicht vorzuliegen, sonst müssten die Werte in der Spalte "Diff" ja immer weiter ansteigen und das tun sie nicht. Anhang 55861 Was mich jedoch stutzig macht, ist das in der "Memory" Übersicht unten Links die Zahlen "blocks" und "bytes" immer weiter steigen. Während die Zahlen in den Klammern, also Objekte, Strings etc., gleich bleiben. Anhang 55862 Kann es sein das die Software ständig neuen Speicher belegt und kurz drauf wieder frei gibt. Dieser freigegebene Speicher jedoch nicht bzw. nicht sofort an das Betriebssystem zurückgegeben wird? Bzw. Windows 7 das überhaupt nicht macht, weshalb der Speicher bei Windows 7 immer weiter anwächst. Die Frage wäre dann wie verhindere ich das bzw. wie teile ich dem Betriebssystem mit das der Speicher wieder frei ist? |
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Zitat:
Dieser Effekt führt aber weder dazu, dass die Anwendung zu viel Speicher verbraucht, noch dass sie abstürzt. Wie viel Speicher hat die Anwendung denn, wenn sie abstürzt und mit welchem Fehler stürzt sie ab? |
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Beispiel:
Erzeue immer wieder viele
Delphi-Quellcode:
oder
TEdit.Create(nil)
Delphi-Quellcode:
und vergiss sie freizugeben.
TEdit.Create(Self)
Bei Letzterem würden die Edits aber an der Form hängen und somit beim Beenden freigegeben, bevor der Speichermanager seine Leck-Kontrolle durchführt. Zur Laufzeit würde aber in beiden Fällen der Speicher sich füllen. |
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Zitat:
Ich weiß nicht ob das möglich ist, dem Speichermanager irgendwie zur Laufzeit ab und an mitzuteilen das er "aufräumen" soll. Und irgendein Unterschied muss die Windows Version ja machen, warum sonst verhält sich die gleiche Software auf unterschiedlichen Versionen anders. Zitat:
|
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Zitat:
(bzw. 3 GB, in einem 32-Bit-Windows) aber ist es wirklich ein Speicherleck, dann wird das Knallen so nur verzögert, aber nicht verhindert. |
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Zitat:
|
AW: Anwendung frisst auf Windows 7 Arbeitsspeicher
Hallo,
es gibt auch eine Möglichkeit vom integrierten FastMM4 Statistikdaten abzurufen. Ich weiß nur nicht mehr auswendig wie. Und um dem FastMM4 das verbesserte Melden von Speicherlecks beizubringen brauchst du die freie komplette Variante von FastMM4 die du im Internet findest. Die in Delphi integrierte Variante liefert da nicht alles benötigte mit. Grüße TurboMagic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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-2025 by Thomas Breitkreuz