我目前正在寻找一种解决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。
答案 0 :(得分:2)
是的FastMM4在最新的SVN版本中具有OSX泄漏报告支持。不幸的是,一个简单的空Delphi FMX应用程序的“全局”泄漏使得分析mem-logfile变得困难。 XE10中已修复了一些泄漏,但MacApi.ObjectiveC桥中的某些对象仍然会产生泄漏。我在Quality Central&质量门户(QC和QP)。因此,使用FastMM4进行泄漏检测很困难。
请分开Delphi对象泄漏和ObjectiveC泄漏,其次你可以找到仪器。