Speicherbedarf des Programmes wächst
-
Moin,
hab mal wieder ein Problem.
Habe jetzt ein etwas größeres Projekt fertig. Ist ein Programm, dass alle 10 Minuten eine Logdatei durchsucht und bei Alarm eine Email versendet.
Allerdings wächst der Speicherbedarf immens. Zu Programmstart fängt es mit ca. 5 MB Speicherbedarf an und wächst innerhalöb von 50 Minuten auf 223 MB an.
Habe dies reduzieren können indem alle Speicherreservierungen die mit new erzeugt wurden wieder freigegeben werden. Der Speicherbedarf wächst immer noch, aber langsamer. Hat jemand eine Idee wie dies vermieden werden kann, ohne das Programm neu zu starten.
OS Win NTFGGF
-
Der Speicherbedarf wächst immer noch, aber langsamer.
dann hast du noch nicht alles freigegeben.
Übrigens ist die Anzeige im Taskmanager nicht syncrone mit der reellen Speichernutzung.
Schalte den COdeGuard ein (Siehe Hilfe)
Der sagt dir wo Speicherlöcher sind....
-
Nachdem ich einen kleinen Fehler beseitigt habe zeigt Codeguard keine Fehlermeldung mehr an. Der Speicherbedarf des Programmes stiegt pro Durchlauf um 16 KB. Habs auch schon endgütlig komopiliert probiert. Hilft nix.
Hab auch echt alle new´s wieder gelöscht.Keine ne Idee ??
FGGF
-
Grenze den Fehler ein mensch. Stell dich mal nicht so an, und finde den Aufruf der das Leak verursacht.... Ich glaub kaum, dass jemand hier im Moment seine Kristallkugel benutzen kann um dir den Fehler zu zeigen... zumindest in meiner herrscht im Moment dichtes Schneetreiben (hat man hald von den Importwaren *dz*)
-junix
-
The Godfather schrieb:
Habe dies reduzieren können indem alle Speicherreservierungen die mit new erzeugt wurden wieder freigegeben werden. Der Speicherbedarf wächst immer noch, aber langsamer.
Du verkaufst dies hier, wie wenn die Speicherfreigabe von Blöcken nach new eine grandiose Errungenschaft wäre... NEIN, sie ist notwendig. Was man nicht mehr braucht, freigeben.
Für Dein Problem gibt's zwei Möglichkeiten:
Du hast new/delete und new[]/delete[] gemischt
Du hast mit new allokierte Blöcke übersehen und doch irgendwelche nicht freigegeben
Ähnliche Fehlerquellen gibt's noch beim kopieren von Objekten, daß hier ein Objekt verloren geht und nicht mehr freigegeben wird... etwa so:
Object* pObject = new Object(); pObject = new Object(); // ein neues Objekt drüber schreiben delete pObject;
Hier hast Du ein Speicherloch von einem Objekt. Sowas kann es in Deinem Falle auch sein.
Es ist grundsätzlich eine gute Idee, wenig mit new/delete zu arbeiten und Objekte möglichst direkt zu instanziieren (was leider aber bei VCL-Klassen nicht geht, aber bei eigenen schon).
-
Das gabs doch schonmal...
Link
Wir haben festgestellt, dass die Anzeige vom Taskmanager nicht richtig funktioniert... Der Speicher ist trotzdem frei...
-
Danke erstmal für die Tips.
@ AndreasW: Danke für den Tip mit Codeguard. Funktioniert ganz gut.
Hab das Probelm jetzt lösen können. Der Speicherbedarf steigt zwar noch leicht an bis ca. 8MB und dann fällt er zurück auf 2 MB. Hab noch ein paar Sachen optimiert und noch ne TStringList gefunden, die nicht gelöscht wurde.
@ Junix: Wenn deine Kristallkugel wieder geht, sag mal Bescheid. Vielleicht hab ich dann noch ein paar Fragen an sie.
:p
@aaaabyx: ICh kann dir nicht sagen ob der Windows NT Taskmanager geht oder nicht. Aber ich denke schon.
FGGF
PS: Ihr habt ein Erstklasseforum Leute. Macht weiter so.