![]() |
Datenbank: Firebird • Version: 3.0.11 • Zugriff über: UIB
Speicherleck UIB + FB30
Moin,
hatte gerade ein übelst zu findendes Speicherleck in einer Anwendung. Die Ausgaben von FastMM4 sahen nicht nach einem Speicherleck aus, der Process Explorer und auch der Task-Manager waren anderer Meinung. Konnte das ganze nun auf UIB in Verbindung mit Firebird 3.0 eingrenzen (mit Firebird 2.5 gibt es das Problem anscheinend nicht). Habe jetzt erstmal einen Workaround gebaut, indem ich die Verbindung zur Datenbank die ganze Zeit geöffnet halte, somit ist das kein akutes Problem mehr. Jeder Connect/Disconnect zur Datenbank belegt etwa 420 Bytes, was bei mir nach einiger Server-Laufzeit eine ordentliche Menge ergab... Der Speicher wird offenbar in der DLL angefordert, somit ausserhalb der Zuständigkeit von FastMM4. Kann das jemand bestätigen? Taucht das Problem nur mit UIB auf, oder auch mit anderen DB-Komponenten?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Database: TUIBDataBase; i: Integer; begin Database := TUIBDataBase.Create; try Database.LibraryName := 'fbclient.dll'; Database.DatabaseName:= 'localhost/3050:database.fdb'; Database.UserName := 'SYSDBA'; Database.PassWord := 'masterkey'; DataBase.CharacterSet := csUTF8; sleep(5000); for i := 1 to 1000 do // dauert etwa 30s, führt zu etwa 420kb Leck (100000x -> Leck 42MB) begin DataBase.Connected := TRUE; Database.Connected := FALSE; end; finally Database.Free; end; end; |
AW: Speicherleck UIB + FB30
TUIBDataBase kenne ich nicht, aber ich habe das mal mit der alten TFIBDatabase getestet und kommt kein Speicherleck.
Welche Version von FB3 hast du im Einsatz? Ich habe die letzte Firebird 3.0.11 installiert. |
AW: Speicherleck UIB + FB30
Vielleicht habe ich auch nicht die richtige Stelle gefunden, aber
![]() |
AW: Speicherleck UIB + FB30
Danke @Uwe für den Link.
Mit TUIBDataBase gibt es bei mir auch kein Speicherleck und TUIB ist sogar noch minimal schneller. |
AW: Speicherleck UIB + FB30
![]() Es gibt ein paar fortgeführte Forks (nur noch 2 Jahre alt) Du nutzt eine uralte Interbase-Komponente, um auf eine nahezu aktuelle Firebird-Datenbank zuzugreifen. Es gibt aktuellere Komponenten direkt für Firebird, aber z.B. auch universelleres ala FireDAC oder UniDAC können auf Firebird zugreifen. joar Ein Speicherleck ist, wenn etwas bei Programmende noch nicht freigegeben ist. (jedenfalls so, wie FastMM es standardmäßig prüft) Packe mal einen der beiden Schleifen in einen Button
Delphi-Quellcode:
// Speicherleck
for i := 0 to 1000000 do TRichEdit.Create(nil); // kein Speicherleck (jedenfalls kein "Echtes", da sich doch jemand um die Freigabe kümmert) for i := 0 to 1000000 do TRichEdit.Create(Self); |
AW: Speicherleck UIB + FB30
Ich benutze 3.0.11.37703, war aber mit 3.0.10.x dasselbe Problem.
Das zwei jahre alte Repo habe ich eben auch ausprobiert, da hat sich aber nix geändert... Das habe ich vielleicht missverständlich ausgedrückt: Es gibt kein Speicherleck in dem Sinne, das FastMM beim Beenden etwas zu reporten hätte. Letztlich werden aber immer mehr "Private Bytes" belegt (und nie wieder freigegeben), wenn abwechselnd isc_attach_database / isc_detach_database ausgeführt wird. Ich habe jetzt mal in TUIBDatabase eine TestLeak-Methode eingebaut, die auf das wesentliche reduziert ist... Muss nach isc_attach_database und/oder isc_detach_database vielleicht noch irgendwas aufgeräumt werden?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Database: TUIBDataBase; i: Integer; begin Database := TUIBDataBase.Create; try Database.LibraryName := 'fbclient.dll'; // Version 3.0.11.33703, installierter Server ebenfalls... Database.DatabaseName:= 'localhost/3050:database.fdb'; Database.UserName := 'SYSDBA'; Database.PassWord := 'masterkey'; DataBase.CharacterSet := csUTF8; sleep(5000); DataBase.Connected := TRUE; Database.Connected := FALSE; Database.TestLeak; // TestLeak macht letztlich 1000x in Folge AttachDatabase/DetachDatabase: // procedure TUIBDatabase.TestLeak; // var // i: Integer; // begin // for i := 1 to 1000 do // begin // FLibrary.AttachDatabase(AnsiString(FDatabaseName), FDbHandle, AnsiString(FParams.Text), BreakLine); // FLibrary.DetachDatabase(FDbHandle); // end; // end; // // procedure TUIBLibrary.AttachDatabase(const FileName: RawByteString; var DbHandle: IscDbHandle; // Params: AnsiString; Sep: AnsiChar = ';'); // begin // Params := CreateDBParams(Params, Sep); // CheckUIBApiCall(isc_attach_database(@FStatusVector, Length(FileName), Pointer(FileName), // @DBHandle, Length(Params), PAnsiChar(Params))); // end; // // procedure TUIBLibrary.DetachDatabase(var DBHandle: IscDbHandle); // begin // CheckUIBApiCall(isc_detach_database(@FStatusVector, @DBHandle)); // // if connection lost DBHandle must be set manually to nil. // DBHandle := nil; // end; finally Database.Free; end; end; |
AW: Speicherleck UIB + FB30
Hallöle...8-)
Zitat:
|
AW: Speicherleck UIB + FB30
Zitat:
|
AW: Speicherleck UIB + FB30
Klar doch. "localhost" geht mit Professional...:wink: oder nicht?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 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