AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Memory Leaks bei Verwendung von System.JSON

Ein Thema von TheSledgeHammer · begonnen am 12. Feb 2020 · letzter Beitrag vom 4. Jun 2020
Antwort Antwort
BastiFantasti

Registriert seit: 5. Nov 2014
Ort: Baden Württemberg
145 Beiträge
 
Delphi 12 Athens
 
#1

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 08:18
Hallo zusammen,

es liegt schon an der Delphi Implementierung des JSON Parsers.
Ich habe gerade das gleiche Problem. Ich polle eine REST Schnittstelle von Delphi aus, die mir einen JSON String zurück liefert. Nach kurzer Zeit bekomme ich die Meldung das der Speicher voll ist.

Ich versuche ein einfaches Beispielprogramm zu erstellen und stelle es hier ein.

Viele Grüße
Bastian
Bastian
  Mit Zitat antworten Zitat
BastiFantasti

Registriert seit: 5. Nov 2014
Ort: Baden Württemberg
145 Beiträge
 
Delphi 12 Athens
 
#2

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 08:49
Sodele,

Projekt ist im Anhang.

Zum Testen:
- Projekt auf Debug kompilieren
- über IDE starten
- 1-2 mal die Schaltfläche btnParse klicken
- Anwendung beenden

FastMM4 zeigt die Leaks und schreibt ein Logfile im gleichen Verzeichnis
Angehängte Dateien
Dateityp: zip SystemJsonMemoryLeak.zip (325,8 KB, 10x aufgerufen)
Bastian
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 09:05
Was erwartest du?

Du lässt dir mittels JsonValue := TJSonObject.ParseJSONValue(JsonString); etwas erstellen und gibst es nie wieder frei.

Du musst das auch schon wieder freigeben.
Delphi-Quellcode:
  // create TJSonObject from string
  JsonValue := TJSonObject.ParseJSONValue(JsonString);
  if Assigned(JSonValue) then
     try

        // get the array
        JsonArray := JsonValue.GetValue<TJSONArray>('phones');

        // iterate the array
        for ArrayElement in JsonArray do begin
           if ArrayElement.GetValue<String>('name') = User then
           begin
            Result := ArrayElement.GetValue<boolean>(Field);
            break;
           end;
        end;
     finally
        JSonValue.Destroy();
     end;
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.513 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 09:54
Noch besser "JSonValue.Free();" statt "JSonValue.Destroy();"
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 10:08
Nein, warum? Es ist doch völlig klar dass die Variable nicht nil ist, also kann man sich die nochmalige Überprüfung auch sparen.
  Mit Zitat antworten Zitat
BastiFantasti

Registriert seit: 5. Nov 2014
Ort: Baden Württemberg
145 Beiträge
 
Delphi 12 Athens
 
#6

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 10:37
allein das Json Objekt Freizugeben bringt nichts.
Hab ich auch schon versucht.

Delphi macht da intern so viele Unterobjekte (je nach Datenstruktur) und gibt die Teile aber nicht geregelt wieder frei wenn ich die JsonValue Variable freigebe.
JsonValue.free hatte ich drin, die Leaks waren dennoch da.
Bastian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 10:38
Das macht man nicht, weil

weil

na weil in de Hilfe steht, dass man Destroy nicht direkt aufruft, deswegen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BastiFantasti

Registriert seit: 5. Nov 2014
Ort: Baden Württemberg
145 Beiträge
 
Delphi 12 Athens
 
#8

AW: Memory Leaks bei Verwendung von System.JSON

  Alt 4. Jun 2020, 10:42
ich hatte es mit .free drin.
FastMM hat aber dennoch ordentlich Leaks rausgeschrieben.

Ich teste nochmal
und ja, die destroy Methode rufe ich normal nicht direkt auf.
Normal FreeAndNil


Update:

jetzt habe ich es mit FreeAndNil freigegeben und jetzt scheint er gerade keinen Speicher mehr zu verschwenden.
Komisch ist, dass ich es vorher genau so hatte ...
Bastian

Geändert von BastiFantasti ( 4. Jun 2020 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:09 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