Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Speicherauslastung im Taskmanager wird immer größer


tortom1000 - Mi 23.02.11 12:51
Titel: Speicherauslastung im Taskmanager wird immer größer
Hallo,
folgende Zeilen erhöhen pro Aufruf 4 KB Speicherbedarf laut Taskmanager:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  ServiceManager := TServiceManager.Create;
  try
    ServiceManager.Connect; // Connects to the local Service-Manger
    ServiceManager.OpenServiceConnection(pchar(dienst[i]))
    if ServiceManager.ServiceStopped then dienststarten:='ja';
  finally
    FreeAndNil(ServiceManager);
  end;

Die zugrunde liegende Unit ServiceManager habe ich von swissdelphicenter [http://www.swissdelphicenter.ch/de/showcode.php?id=1322] und entsprechend eingebunden.

Kennt jemand das Problem bzw. kann helfen, das Problem zu erkennen/lösen?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: URL-Tag hinzugefügt.


Narses - Mi 23.02.11 14:19

Moin!

user profile icontortom1000 hat folgendes geschrieben Zum zitierten Posting springen:
Kennt jemand das Problem bzw. kann helfen, das Problem zu erkennen/lösen?
Ich würde das erstmal nicht als "Fehler", sondern als "Effekt" bezeichnen. :nixweiss: Ich habe mir die Klasse TServiceManager jetzt nicht im Detail angesehen, aber dort wird ordentlich mit PChars hantiert. Das kann eine Menge temporärer Strings auf dem Heap erzeugen, wenn da Concatenations gemacht werden. Das wiederum soll wohl (laut user profile iconjaenicke) bei Delphi-Versionen vor XE zu "Problemen" im Speichermanager geführt haben. :nixweiss:

Ich habe so ähnliche Effekte auch schon bei einem meiner Tools (da waren allerdings auch Threads im Spiel) bemerkt. Allerdings hat auf lange Sicht der Speicherbedarf im Taskmanager auch mal wieder abgenommen. Das muss nicht gleich ein Mem-Leak sein. :idea:

cu
Narses


jaenicke - Mi 23.02.11 15:04

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Das wiederum soll wohl (laut user profile iconjaenicke) bei Delphi-Versionen vor XE zu "Problemen" im Speichermanager geführt haben. :nixweiss:
Der Übergang ist nicht unbedingt XE, auch ab Delphi 2006 hat sich da durch FastMM einiges getan.

Hier kann ich das Problem weder mit 2006 noch mit XE nachvollziehen, hab aber grad auch nicht die Zeit es mir wirklich anzuschauen.

Um welche Delphiversion geht es denn? Kannst du ein Demoprojekt noch anhängen bitte?


BenBE - Mi 23.02.11 16:10

Hab mir die Unit grad nicht angeguckt, aber ist das "normal", dass da ein Open ausgeführt wird, ohne zugehöriges Close?


jaenicke - Mi 23.02.11 16:19

Naja, ein kurzer Blick sagt mir, dass CloseServiceHandle jedenfalls nie aufgerufen wird. Ob das erforderlich wäre, weiß ich gerade nicht, müsste ich auch nachschauen.


tortom1000 - Do 24.02.11 14:03

Hallo,
ich nutze Delphi 7. Ich werde das Verhalten in einem übersichtlichen Demo-Projekt
mal isolieren und posten.
Brauche dazu aber ein bissel Zeit.

Vorab schon mal vielen Dank für eure Hilfen.

Gruß
Tortom

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

so, hier die demo...


jaenicke - Do 24.02.11 14:56

Du hast das Formular in der Unit1.pas + Unit1.dfm im Verzeichnis drüber vergessen. ;-)


tortom1000 - Fr 25.02.11 10:54

hupps,
sorry, da war ich gestern wohl nicht ganz bei der Sache... :?

Hier nun die funktionierende.

Über den Timer wird jede Sekunde der Dienst gestartet und
nach 1 Sekunde (per sleep) wieder gestoppt.
Pro Timerdurchlauf erhöht sich bei mir die Speicherauslastung
um 4 k, manchmal aber auch nicht(???) so regelmäßig.
Fakt ist jedoch, das die Speicherauslastung anwächst.


Bergmann89 - Fr 25.02.11 16:57

Hey,

wenn es wirklich an der Speicherverwaltung liegt, dann gibts auch ne FastMM4-Unit für Delphi7 [http://sourceforge.net/projects/fastmm/]. Ich benutzt die auch seit einiger Zeit und kann mich nicht beschweren.

MfG Bergmann.


tortom1000 - Di 01.03.11 10:24

Hallo Bergmann,
was genau macht denn die FastMM4-Unit?
Ist es ein Tool, um Fehler zu "entdecken", die dann per eigener Änderung des Programms abgestellt werden müssen
oder korrigiert das Tool diese "Fehler" selbst.

Gibt es dazu 'ne Anleitung. (Hab wenig auklärendes darüber im Netz gefunden...)

Viele Grüße
Tortom


elundril - Di 01.03.11 10:53

Fastmm4 kann dir zb zeigen ob und wo du speicherlecks hast. Ob es noch mehr kann weiß ich nicht, ich habs vorrangig immer dafür verwendet.

Von selbst die fehler beheben kann das ding ber (noch) nicht, das bleibt weiterhin an dir hängen.

Lg elundril


jaenicke - Di 01.03.11 11:51

Wenn du den FullDebug-Mode anschaltest, bekommst du ein ausführliches Log inkl. Stacktrace, wenn entweder ein Speicherleck auftritt oder wenn auf ein bereits freigegebenes Objekt zugegriffen wird.

Was welche Option bewirkt ist sehr sehr ausführlich in der .inc Datei definiert.


Bergmann89 - Di 01.03.11 16:43

Hey,

außer dem debug mode (der auch sehr nützlich is) kann man noch bisl mehr speicher raus holen. Steht auch mit in der beschreibung in der unit. Bei 64bit systemen war es glaube 4gb. Bei 32bit systemen bisl weniger, aber immernoch mehr als die standarspeicherverwaltung von delphi.

Mfg Bergmann

p.s: cool, mein 1. Beitrag, dem ich vom handy aus geschrieben hab :P


jaenicke - Di 01.03.11 16:49

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
p.s: cool, mein 1. Beitrag, dem ich vom handy aus geschrieben hab :P
Bei meinen vom Handy aus stimmt trotzdem die Groß- und Kleinschreibung. :P


Bergmann89 - Di 01.03.11 16:56

Hey,

dazu hatte ich jetz keine lust^^ es is früh am morgen und ich lieg noch im bett xD

Mfg Bergmann