AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Speicherverbrauch überwachen - Speicherfresser finden
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherverbrauch überwachen - Speicherfresser finden

Ein Thema von MrMooed · begonnen am 6. Apr 2013 · letzter Beitrag vom 6. Apr 2013
Antwort Antwort
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#1

Speicherverbrauch überwachen - Speicherfresser finden

  Alt 6. Apr 2013, 11:33
Hey DP,

ich bin gerade am verzweifeln Ich finde in meinem Programm einfach nicht die Stelle, an der er unnötig Arbeitsspeicher verballert. Im Extremfall kommt er an die 2gb grenze
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

Geändert von MrMooed ( 6. Apr 2013 um 16:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: Speicherverbrauch überwachen - Speicherfresser finden

  Alt 6. Apr 2013, 11:44
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
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Speicherverbrauch überwachen - Speicherfresser finden

  Alt 6. Apr 2013, 12:17
stimmt. Dort sollte ich sie freigeben .. jedoch dachte ich, dass es mit einem einfachen TMath.Destroy reicht

Brachte jedenfalls keine sichtbare verbesserung Hat also wohl noch einen anderen Grund
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#4

AW: Speicherverbrauch überwachen - Speicherfresser finden

  Alt 6. Apr 2013, 12:34
jedoch dachte ich, dass es mit einem einfachen TMath.Destroy reicht
Nun, ich habe mir angewöhnt, für jedes .Create auch ein .Free (oder auch FreeAndNil) an die passende Stelle zu setzen. Ich weiß grad nicht, welcher Owner bei einem .Create ohne Parameter benutzt wird und demzufolge für die Freigabe "zuständig" ist, aber richtig eingesetzt schadet ein .Free nicht.

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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Speicherverbrauch überwachen - Speicherfresser finden

  Alt 6. Apr 2013, 12:35
Hallo,

normalerweise würde das ganze in Resourceschutzblöcke eingepackt.

Delphi-Quellcode:
begin
  tmp := TStack.create
  try
    term := TQueue.create
    try
      ....
    finally
      term.free;
    end;
  finally
    tmp.free;
  end;
end;
Du kannst auch FastMM nutzen um Memoryleaks zu finden.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Speicherverbrauch überwachen - Speicherfresser finden

  Alt 6. Apr 2013, 14:40
Was gibt es nicht alles für nette Tools

Werde mir wohl angewöhnen müssen, Objekte nach der Benutzung wieder zu "freen"
Aber mit FastMM läuft es nun wunderbar - Nach den Berechnungen fällt er wieder auf <1mb Speicher zurück

Danke euch beiden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz