2015-09-25 14 views
5

私は現在、RESTクライアントのMac実装で明らかなメモリリークを回避する方法を模索しています。メモリリークが(XE8、1更新を実行して)以下れる生成するコード:Delphi REST mac memory leak

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. 

これは漏れを示すコードの最小のブロックです。基本的に、RESTリクエストを頻繁に行う同期サービスがあります。

MadExceptを使用してWindowsで実行すると、リークは検出されません。 ProcessMonitorで実行中のプロセスを調べると、使用されているメモリの量は増えません。

しかし、Macで実行すると、アクティビティモニタには、アプリケーションに割り当てられたメモリが引き続き増加していることが示されます。さらに、Instrumentsを使用して実行すると、Mac上のいくつかのURLおよびHTTPクラスを扱うリークがあるようです。

誰もこのリークを解決する方法を知っていますか?

(Macでリークがどこから来ているのかを知ることは本当に役立つでしょうが、リストされているDelphiクラスはTMethodImplementationInterceptだけです。これはDelphi Mac用dSYMファイルを生成しません。誰もがあまりにも素晴らしいだろうことを回避する方法を、知っていれば!)

UPDATE を1から10までのiMaxを変化させ、FastMM4出力を比較することにより、それが表示されます漏れはクラスMacapi.ObjectiveC.TConvObjID.XFormにあります。 10回の反復出力には、1回の反復と比較してスタックトレースとして9回以上のリークが含まれています。私はこれをRSP-12242としてEmbarcaderoに報告しました。

+0

BTW 'TMethodImplementationIntercept'は**ではありません**クラス –

+1

Mac用にFastMMは存在しますか?詳しいリークレポートはありますか? –

+0

品質の高いポータルに報告してください。 –

答えて

2

はいFastMM4には、最新のSVNリビジョンでOSXリークレポートのサポートがあります。残念なことに、単純な空のDelphi FMXアプリケーションからの「グローバル」リークは、mem-logfileの解析を困難にします。 XE10ではいくつかのリークが修正されていますが、MacApi.ObjectiveCブリッジの一部のオブジェクトでもリークが発生します。私は品質中心でそれを報告した&品質ポータル(QC & QP)。 FastMM4をリーク検出に使用することは困難です。

デルファイのオブジェクトリークとObjectiveCリークを分離してください.2番目に楽器で見つけることができます。

+1

私は最新のSVNリビジョンを使用していませんでした。ありがとう! – jllangston

+0

このテストでFMXを使用していないので、上記のコードでループを削除すると、FastMM4はいくつかのリークを報告します。列挙された1838年のほとんどは小さいが、800バイトの範囲に2つと2000バイトの範囲に1つがある。 – jllangston