![]() |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Da werden einige Variablen Objekte (Krümelkackermode: "Instanz einer Klasse") erzeugt, aber nicht wieder freigegeben, vor allem in den Funktionen BuiltIDList und BuiltIDListEx. Da letztere noch dazu in einer Schleife x-fach aufgerufen wird, dengeln dann mehrere Objekte von http und ssl im Speicher rum -> Speicherleck. Dagegen hilft einerseits konsequentes Einhalten von Coding-Richtlinien* und andererseits ReportMemoryLeaksOnShutdown oder andere Tools zum Finden von Speicherlecks.
[EDIT] Da gibt's sogar noch weitere Objekte in den anderen Funktionen, die nicht wieder freigegeben werden. [/QUOTE] *) Man muss sich einfach selbst zwingen, sauber zu schreiben, d.h. sofort beim Erzeugen eines Objekts das Freigeben gleich mit hinschreiben, bevor man sich an den eigentlichen Code zum Verwenden des Objekts macht. Mal ein Beispiel: erst dieses Rumpfgerüst schreiben:
Delphi-Quellcode:
und dann erst im
objekt:= TKlasse.Create;
try // Code finally objekt.Free end;
Delphi-Quellcode:
-Block den eigentlichen Code hinzufügen. So gehe ich jedenfalls vor.
try
MfG Dalai PS: Übrigens ist der Name BuiltIDList falsch, es müsste BuildIDList heißen, denn das Teil wird erst aufgebaut und wurde nicht bereits erzeugt (built = Vergangenheitsform von build). |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Entwickelst du für die Mobile Plattforms oder warum gibts du da einige Sachen nicht frei?
Prüfe deinen Code - überall wo du Instanzen erzeugst musst du die irgendwann auch wieder frei geben. Das sehe ich aber nicht bei allen Instanzen ... |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Ja das ist korrekt. Werde das nochmal überarbeiten. Danke
Vielen Dank. Es lag an den vielen Instanzen von IDHttp und dem SSL Teil. Funktioniert jetzt bestens mit 5MB RAM-Verbrauch. Records und Variablen müssen nicht freigegeben werden oder? |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Zitat:
Delphi-Quellcode:
Und Objekte, die man erzeugt, muss man auch wieder freigeben.
var sl: TStringList;
MfG Dalai |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Zitat:
|
AW: Mein Programm ist Arbeitsspeicher hungrig..
Hallo,
ich würde noch packend Record schreiben. Für Speicherlecks werfe ich noch FastMM4 rein.. Heiko |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Packed wird hier nichts ändern und bei aktiv genutzten Records im Speicher ist wowas es etwas ungünstiger.
Vorner der 4 Byte Pointer und dahinter eine gute Anzahl an Bytes, womit am Ende alles praktisch schon gepackt ist, da keine Leerstellen entstehen und es sind sogar so viele Bytes (Boolean), daß der Record voll ist. (vielfaches von 4) Und dann ist das Array mit den Records eh nichtmal 2 MB groß. Wie hier welche entdeckt haben, liegt das Problem ja ganz wo anders. (Speicherlecks) |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Zitat:
{$A1} Und NATÜRLICH keinen Logstring nehmen.... Wie oft steht da der gleiche String drin? |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Bytes sind nie Aligned, bzw. immer an 1 ausgerichtet, egal ob mit oder ohne Packed.
{$ALIGN} gibt nur die maximale Ausrichtung an und kleineren Typen werden immer an ihrer eigenen Größe ausgerichtet. Zitat:
Die Strings werden alle "neu" erzeugt (teilweise aus einem Anderen rauskopiert) und sind demnach immer unique. (gibt standardmäßig "leider" keinen Algo, der das zusammenfasst) |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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