![]() |
Eigener Dienst -> Speicherauslastung wächst und wächst...
Liste der Anhänge anzeigen (Anzahl: 1)
Hi
bin grad drann mein erster eigener Dienst zu proggen. Eigentlich funktioniert alles so wie es soll. Nur eines nicht. Die Speicherauslastung des Services vergrössert sich um ca. 4 KByte pro sekunde... Proportional zu E/A andere, beides im Taskmgr gesehen... Irgendwo hab ich wohl vergessen speicher freizugeben oder so... aber wo??? so sieht mein ServiceExecute aus:
Delphi-Quellcode:
Der ganze Quellcode im Anhang...
procedure TSisterWatch.ServiceExecute(Sender: TService);
begin //ShowMessage('OnExecute - begin'); while not Terminated do begin TRY // try to catch a user if Username <> '' then begin // AUTOSCAN // THIS SECTION IS FOR USER WHO JUST LOGGED IN if (Username <> GetSession) or (Welcome = False) then begin Username := GetSession; // If the logged in user is not on the blacklist it will autoscan now if not IgnoreUser then begin Welcome := True; Log('logged in with IPAddress: '+GetIPAddress); // get about the users logontime logontime := Now; // check if the user already exists in the database CheckDBforUser(ADOQuery1,ADOStoredProc1); // Save to database that the user is logged in UpdateUserInfo(Username, 1); // get all info from User Table "t_bb_user" ADOQuery3.Close; ADOQuery3.Parameters.ParamValues['@username'] := username; ADOQuery3.Open; if ADOQuery3autostart.AsBoolean then ScanAndWriteToDB; // Activate TCP Server ActivateTCPServer; end; end else if StartManScan then begin try // check if the user already exists in the database CheckDBforUser(ADOQuery1,ADOStoredProc1); ScanAndWriteToDB; finally // its very important to reset the variable StartManScan StartManScan := False; end; end; end else Username := GetSession; EXCEPT on e:Exception do LOG('FATAL ERROR#@: '+e.Message); END; ServiceThread.ProcessRequests(False); Sleep(1000); end; //ShowMessage('OnExecute - end'); end; |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Da wird vermutlich bei jedem Durchlauf ein Objekt angelegt aber nie wieder freigegeben.
Also wird jedes mal ein neues Objekt erzeugt. Somit wächst der Speicherbedarf kontinuierlich. |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Was macht GetSession?
|
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Zitat:
Zitat:
Delphi-Quellcode:
// Ergänzung:
function TSisterWatch.GetSession: String;
//var // TS : TJwTerminalServer; --> wurde testhalber als public var von TSisterWatch deklariert begin try TS := TJwTerminalServer.Create; TS.Connect; TS.EnumerateSessions; Result := TS.Sessions[0].Username; // every second before the first login it raise an exception! FreeAndNil(TS); {its very important to free TS memory!} except FreeAndNil(TS); {its very important to free TS memory!} end; end; Eigentlich hab ich zuerst gedacht, dass es an eben dieser Funktion liegen muss, da dies die einzige ist, die immer wieder aufgerufen wird... aber TS wird ja immer wieder freigegeben oder nicht? |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
anstelle von except kannst du mit finally arbeiten dann sparst du dir die doppelte ausführung von freeandnil
|
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Warum arbeitest Du zum Merken der Dateiinformationen mit 7 Stringlisten anstelle von Array of TSearchRec ? Der Speicherverbrauch kann auch daran liegen, dass die Datensätze gecached werden. Im Zweifelsfall verwendest Du FastMM oder ähnliche um zu ermitteln, wo das evtl. leckt.
|
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Zitat:
Zitat:
kann noch mal jmd einen Blick drauf werfen? Gesammte Sourcecode steht als "main.pas" im ersten Beitrag zum DOWNLOAD bereit. |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Hallo,
warum nimmst du nicht MemCheck oder FastMM4 und überlässt denen die Suche nach dem Leck ? Heiko |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Du verwendest dort die TIndyBaseClientData. Ist da vielleicht der Fehler, denn das wird bei jedem Connect created?
[edit]Und lesen hilft Zitat:
![]() [/edit] |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Zitat:
Zitat:
Hab mal irgendwo gelesen, dass wenn ich mein Programm (in meinem fall ein Dienst) beende, sollte ich eine MsgBox von FastMM sehen, auch diese sehe ich NICHT... :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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