Delphi REST mac内存泄漏

jll*_*ton 5 delphi rest macos memory-leaks delphi-xe8

我目前正在寻找一种方法来解决REST客户端的Mac实现中的明显内存泄漏问题.生成内存泄漏的代码如下(运行XE8,更新1):

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.
Run Code Online (Sandbox Code Playgroud)

这是演示泄漏的最小代码块.从本质上讲,我有一个同步服务,每隔一段时间就会发出一次REST请求.

当我在Windows上运行它时,使用MadExcept,没有发现泄漏.检查ProcessMonitor中的运行进程表明没有增加使用的内存量.

但是,在Mac上运行时,活动监视器会显示分配给应用程序的内存继续上升.此外,当使用Instruments运行时,似乎存在泄漏处理mac上的几个URL和HTTP类.

有人知道如何解决这个漏洞吗?

(顺便说一句,确切知道泄漏来自Mac的确切位置真的很有帮助,但列出的唯一Delphi类是TMethodImplementationIntercept.我相信这是因为Delphi没有生成一个适用于Mac的dSYM文件.如果有人知道解决方法,那也很棒!)

更新 通过iMax从1到10 变化并比较FastMM4输出,似乎泄漏是在类中Macapi.ObjectiveC.TConvObjID.XForm.与1次迭代相比,10次迭代输出包含9次泄漏,其作为堆栈跟踪.我已将此报告给Embarcadero作为RSP-12242.

小智 2

是的,FastMM4 在最新的 SVN 版本中支持 OSX 泄漏报告。不幸的是,简单的空 Delphi FMX 应用程序的“全局”泄漏使得分析内存日志文件变得困难。XE10 中修复了一些泄漏,但 MacApi.ObjectiveC 桥中的某些对象仍然会产生泄漏。我已在质量中心和质量门户(QC 和 QP)中报告了这一点。因此使用FastMM4进行检漏比较困难。

请将Delphi对象泄漏和ObjectiveC泄漏分开,然后您可以使用仪器找到。