![]() |
Speicherverbrauch überwachen - Speicherfresser finden
Hey DP,
ich bin gerade am verzweifeln :evil: Ich finde in meinem Programm einfach nicht die Stelle, an der er unnötig Arbeitsspeicher verballert. Im Extremfall kommt er an die 2gb grenze :pale: Ich habe versucht den Fehler einzugrenzen und es kann eigentlich nur an einer function liegen. Gibt es also von Delphi ein eigenes Mittel, um zu überwachen für welche Variablen er wie viel Speicher nutzt ?
Delphi-Quellcode:
//PostTerm enthällt einen Mathematischen Term in Postfix Notation (UPN). Die Werte wurden als Strings in eine Queue //eingefügt
function TMath.calc(xValue: Extended): Extended; var tmp : TStack; Term : TQueue; a,b : Extended; begin tmp := TStack.create; Term := TQueue.create; repeat Term.enqueue(PostTerm.front); //PostTerm sichern, für den nächsten x-Wert case String(PostTerm.front)[1] of '0'..'9': tmp.push(TExtended.Create(StrToFloat(String(PostTerm.front)))); //Zahlen auf tmp pushen 'x': tmp.push(TExtended.Create(xValue)); // Für X'e den aktuellen xValue pushen else if tmp.getItemCount >= 2 //existieren genug Operanden, wende den Operator an then begin a := TExtended(tmp.top).Value; tmp.pop; b := TExtended(tmp.top).Value; tmp.pop; if String(PostTerm.front) = '+' then tmp.push(TExtended.Create(Add(a,b))) else if String(PostTerm.front) = '-' then tmp.push(TExtended.Create(Sub(a,b))) else if String(PostTerm.front) = '*' then tmp.push(TExtended.Create(Mul(a,b))) else if String(PostTerm.front) = '/' then tmp.push(TExtended.Create(Dur(a,b))); end; end; PostTerm.dequeue; until PostTerm.getItemCount = 0; result := TExtended(tmp.top).Value; tmp.pop; PostTerm := Term; //PostTerm wiederherstellen end; //Edit: Gelöst mittels FastMM4 |
AW: Speicherverbrauch überwachen - Speicherfresser finden
tmp und Term werden jeweils mit .Create erzeugt, aber wo werden sie wieder freigegeben? In der gezeigten Methode jedenfalls nicht; das wäre aber der richtige Ort dafür.
MfG Dalai |
AW: Speicherverbrauch überwachen - Speicherfresser finden
stimmt. Dort sollte ich sie freigeben .. jedoch dachte ich, dass es mit einem einfachen
Delphi-Quellcode:
reicht :gruebel:
TMath.Destroy
Brachte jedenfalls keine sichtbare verbesserung :? Hat also wohl noch einen anderen Grund |
AW: Speicherverbrauch überwachen - Speicherfresser finden
Zitat:
Wenn aber - wie du selber sagst - die Prozessgrößengrenze erreicht wird, müssen entweder sehr viele kleine Objekte erzeugt werden oder wenige große. Schau mal durch, wo evtl. weitere Objektfreigaben fehlen. Es gibt da sicherlich Hilfsmittel zum Finden solcher Lecks (Speichermanager wie FastMM?), aber davon hab ich nicht wirklich Ahnung und überlasse dieses Feld den Wissenden. MfG Dalai |
AW: Speicherverbrauch überwachen - Speicherfresser finden
Hallo,
normalerweise würde das ganze in Resourceschutzblöcke eingepackt.
Delphi-Quellcode:
Du kannst auch
begin
tmp := TStack.create try term := TQueue.create try .... finally term.free; end; finally tmp.free; end; end; ![]() Grüße Klaus |
AW: Speicherverbrauch überwachen - Speicherfresser finden
Was gibt es nicht alles für nette Tools :lol:
Werde mir wohl angewöhnen müssen, Objekte nach der Benutzung wieder zu "freen" :roll: Aber mit FastMM läuft es nun wunderbar - Nach den Berechnungen fällt er wieder auf <1mb Speicher zurück :-D Danke euch beiden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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