AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Leaks bei Verwendung von System.JSON

Ein Thema von TheSledgeHammer · begonnen am 12. Feb 2020 · letzter Beitrag vom 4. Jun 2020
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 12. Feb 2020, 12:30
wenn man meinen Kenntnisstand voraussetzt, dass durch das Zerstören des Main-JSON-Objekts auch alle TJSONValue-Objekte automatisch zerstört werden
Nicht immer. Wird irgendwo an der Owned-Eigenschaft etwas geändert? Ein standardmäßig erzeugter TJsonString hat GetOwned() = True , das sorgt eigentlich dafür dass er von seinem Parent freigegeben wird wenn es selbst endet. Ist das nicht der Fall, wird er auch nicht freigegeben.


Ansonsten solltest du unbedingt FastMM4 in der vollen Version einbauen, der kann dir bei Speicherlecks genau anzeigen wo es erstellt wurde.

Geändert von Der schöne Günther (12. Feb 2020 um 12:33 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 12. Feb 2020, 12:43
Die konkrete Antwort ist wahrscheinlich folgende Zeile:

TmpPair.JsonValue := ... Die Implementation von TJsonPair.SetJsonValue(..) sieht nur so aus:

Delphi-Quellcode:
procedure TJSONPair.SetJsonValue(const Val: TJSONValue);
begin
  if Val <> nil then
    FJsonValue := Val;
end;
Heißt: Er biegt einfach nur seine Referenz FJsonValue um. Richtig wäre wahrscheinlich erst zu schauen ob das bisherige FJsonValue.GetOwned() = True hat und dieses dann erst einmal freizugeben. Das tut er nicht, und das alte JsonValue verbleibt als Speicherleck. Zumindest in meinem Delphi 10.0 Seattle.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 12. Feb 2020, 12:49
Die komplette JSON-Implementation von Delphi ist ein rießiger Graus, wenn es darum geht "selbst" JSON erstellen oder verändern zu wollen. (JSON lesen oder automatisch zu serialisieren und zu deserialisieren ist noch nutzbar)
Da kann man nur empfehlen die Komponenten anderer Hersteller zu nutzen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Feb 2020 um 13:08 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 12. Feb 2020, 12:55
Wir kommen leicht vom Thema ab, aber ich glaube ich habe schon schlimmeres gesehen.

Kennst du den TJsonObjectBuilder?
https://www.delphipraxis.net/198874-...-funktion.html

Oder analog von diesem guten Mann hier etwas in der Richtung:
https://github.com/flobernd/delphi-u...Utils.JSON.pas
  Mit Zitat antworten Zitat
TheSledgeHammer

Registriert seit: 22. Mai 2019
Ort: Mulfingen
43 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 12. Feb 2020, 14:51
Also erstmal vielen Dank für die Posts und Nachfragen.

An der Owned-Eigenschaft ändere ICH nichts, also wenn dann macht das Delphi im Hintergrund glaube ich an der Stelle aber nicht

Dass das Ganze ein Grauß ist, das haben mir andere Kollegen auch schon bestätigt, aber was soll ich sagen: es ist ja eigentlich nichts Großes zu implementieren und extra Komponenten dafür zu installieren, halte ich schon für recht übertrieben. Zumal da es eigentlich im Interesse des Herstellers sein sollte, dass die eigenen System-Komponenten nicht dazu führen, dass Speicherlecks enstehen.

Also zusammengefasst: dass Speicherlecks entstehen ist (leider) normal?!
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.664 Beiträge
 
Delphi 12 Athens
 
#6

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 12. Feb 2020, 14:54
Kannst du ein minimales Beispielprojekt anhängen, mit dem du das reproduzieren kannst? Ich finde, hier gibt zur Zeit es noch recht viel Spekulation.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TheSledgeHammer

Registriert seit: 22. Mai 2019
Ort: Mulfingen
43 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 12. Feb 2020, 15:41
Kannst du ein minimales Beispielprojekt anhängen, mit dem du das reproduzieren kannst? Ich finde, hier gibt zur Zeit es noch recht viel Spekulation.
Hab ich versucht, hab ich an sich auch hin bekommen, bloß hat sich damit heraus gestellt, dass nicht das JSON der Übeltäter war, sondern das TWebModule. Aus Gründen, die ich noch untersuchen muss, wird dieses Modul zwei Mal instanziiert (und auch zerstört, das passt also an sich). Warum allerdings zweimal ist herauszufinden.

Fakt ist - und damit erklärt sich der Mem-Leak - dass das geparste Main-JSON-Objekt nur einmal freigegeben wird. D.h. nach EINmal aufrufen ist korrekt zerstört, nach ZWEImal aufrufen bleibt eine Instanz im Speicher usw. Was ich jetzt eben rausfinden muss, ist, wieso das TWebModule sich mehrmals erzeugt. Das ist der eigentliche Fehler.

Wobei ein Kollege von mir das gleiche Phänomen bestätigen kann, der macht allerdings was ganz was anderes mit JSON, da gibt's kein TWebModule oder ähnliches

Daher meine ursprüngliche Vermutung, dass es am JSON liegt -> falsch gedacht, mea culpa
Tobias
  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:57 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-2025 by Thomas Breitkreuz