Delphi REST mac内存泄漏

时间:2015-09-25 18:55:23

标签: macos rest delphi 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.

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

是的FastMM4在最新的SVN版本中具有OSX泄漏报告支持。不幸的是,一个简单的空Delphi FMX应用程序的“全局”泄漏使得分析mem-logfile变得困难。 XE10中已修复了一些泄漏,但MacApi.ObjectiveC桥中的某些对象仍然会产生泄漏。我在Quality Central&质量门户(QC和QP)。因此,使用FastMM4进行泄漏检测很困难。

请分开Delphi对象泄漏和ObjectiveC泄漏,其次你可以找到仪器。