2015-09-25 19 views
5

Attualmente sto cercando un modo per aggirare una perdita di memoria apparente nell'implementazione Mac del client REST. Il codice per generare la perdita di memoria è il seguente (XE8 esecuzione, modificare 1):Delphi REST perdita di memoria mac

program mac_REST_leak_test; 
{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    System.SysUtils, REST.Client, REST.Types, IPPeerClient; 

var 
    request : TRestRequest; 
    ii, iMax : integer; 
begin 
    iMax := 1; 
    for ii := 0 to iMax do 
    begin 
     request := TRestRequest.Create(nil); 
     // Fake Online REST API for Testing and Prototyping 
     request.Client := TRestClient.Create('http://jsonplaceholder.typicode.com/'); 
     request.Method := rmPOST; 
     request.Execute(); 

     request.Client.Free(); 
     request.Free(); 
    end; 
end. 

Questo è il blocco più piccolo di codice che dimostra la perdita. Essenzialmente, ho un servizio di sincronizzazione che fa richieste di REST ogni tanto.

Quando si esegue questo su Windows, utilizzando MadExcept, non vengono trovate perdite. L'analisi del processo in esecuzione in ProcessMonitor non mostra alcun aumento della quantità di memoria utilizzata.

Quando si esegue su un Mac, tuttavia, il monitor Attività mostra che la memoria allocata all'app continua ad aumentare. Inoltre, quando viene eseguito utilizzando gli strumenti, sembra che ci siano perdite relative a diverse classi URL e HTTP su mac.

Qualcuno sa come risolvere questa perdita?

(Per inciso, sarebbe davvero utile sapere esattamente da dove proviene la perdita su Mac, ma le uniche classi di Delphi elencate sono TMethodImplementationIntercept. Devo credere che questo sia dovuto al fatto che Delphi non genera un file dSYM per Mac. Se qualcuno conosce un modo per aggirare questo, che sarebbe troppo impressionante!)

UPDATE variando iMax da 1 a 10 e confrontando l'uscita FastMM4, sembra che il la perdita è nella classe Macapi.ObjectiveC.TConvObjID.XForm. L'output a 10 iterazioni contiene 9 perdite in più con questo come traccia stack rispetto all'iterazione 1. Ho segnalato questo a Embarcadero come RSP-12242.

+0

BTW 'TMethodImplementationIntercept' è ** non ** una classe –

+1

FastMM esiste per Mac? Presenta report dettagliati sulle perdite? –

+0

Si prega di segnalare questo al portale di qualità. –

risposta

2

Sì FastMM4 dispone del supporto per la segnalazione di perdite OSX nell'ultima revisione SVN. Sfortunatamente, la fuga "globale" da una semplice applicazione Delphi FMX vuota rende difficile l'analisi del file mem-log. Alcune perdite sono state corrette in XE10, ma alcuni oggetti nel bridge MacApi.ObjectiveC generano ancora perdite. L'ho segnalato in Quality Quality & Quality Portal (QC & QP). Quindi è difficile usare FastMM4 per trovare le perdite.

Si prega di separare le perdite di oggetti Delphi e perdite di ObjectiveC, in secondo luogo è possibile trovare con gli strumenti.

+1

Non stavo usando la nuova versione SVN .. Grazie per quello! – jllangston

+0

Non sto utilizzando FMX per questo test e rimuovendo il loop nel codice sopra, FastMM4 segnala un numero di perdite. La maggior parte dei 1838 elencati sono piccoli, ma ci sono 2 nell'intervallo di 800 byte e uno nell'intervallo di 2000 byte. – jllangston