Delphi REST Mac 内存泄漏问题

5

我目前正在寻找一个方法来解决Mac实现REST客户端中明显的内存泄漏问题。生成内存泄漏的代码如下(运行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 上运行时,Activity Monitor 显示分配给应用程序的内存持续增长。 此外,使用 Instruments 运行时,似乎存在与几个 URL 和 HTTP 类相关的泄漏。 有人知道如何解决这个漏洞吗? (顺便说一下,确切地知道 Mac 上的泄漏来自哪里将非常有帮助,但列出的唯一 Delphi 类是 TMethodImplementationIntercept。 我相信这是因为 Delphi 不会为 Mac 生成 dSYM 文件。 如果有人知道解决方法,那就太棒了!) 更新:通过将 iMax 从1变为10并比较 FastMM4 输出,可以看出漏洞在类 "Macapi.ObjectiveC.TConvObjID.XForm" 中。 与1次迭代相比,10次迭代输出包含9个具有此堆栈跟踪的泄漏。 我已将其报告给 Embarcadero,作为 RSP-12242。

顺便提一下,TMethodImplementationIntercept 不是一个类。 - Sir Rufo
1
FastMM在Mac上存在吗?它是否提供详细的泄漏报告? - David Heffernan
请将此报告给质量门户网站。 - LU RD
1个回答

2
是的,最新的SVN版本中FastMM4支持OSX泄漏报告。不幸的是,一个简单的空Delphi FMX应用程序中的“全局”泄漏使得分析内存日志文件变得困难。在XE10中已经修复了一些泄漏问题,但MacApi.ObjectiveC桥接中的某些对象仍然会产生泄漏。我已经在Quality Central和Quality Portal(QC和QP)上报告了这个问题。因此,使用FastMM4进行泄露查找很困难。
请将Delphi对象泄漏和ObjectiveC泄漏分开处理,第二个可以使用工具找到。

1
我没有使用最新的 SVN 版本。谢谢你提醒! - jllangston
我在这个测试中没有使用FMX,并且在上面的代码中删除了循环,FastMM4报告了许多泄漏。其中大部分列出的1838个是小的,但有2个在800字节范围内和一个在2000字节范围内。 - jllangston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接