GVKun编程网logo

macos – Delphi REST mac内存泄漏(mac内存溢出)

9

本文将介绍macos–DelphiRESTmac内存泄漏的详细情况,特别是关于mac内存溢出的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Delp

本文将介绍macos – Delphi REST mac内存泄漏的详细情况,特别是关于mac内存溢出的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Delphi 2009 – 接口属性是否会导致内存泄漏?、Delphi 7.0和内存泄漏?、Delphi 7中使用WMI的内存泄漏、Delphi iOS & macOS App 名称支持国际化多语显示的知识。

本文目录一览:

macos – Delphi REST mac内存泄漏(mac内存溢出)

macos – Delphi REST mac内存泄漏(mac内存溢出)

我目前正在寻找一种方法来解决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.我相信这是因为Delphi没有生成一个适用于Mac的dSYM文件.如果有人知道解决方法,那也很棒!)

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

解决方法

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

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

Delphi 2009 – 接口属性是否会导致内存泄漏?

Delphi 2009 – 接口属性是否会导致内存泄漏?

我继承了一个Intraweb应用程序,它有一个2MB的内存泄漏文本文件,如FastMM4所报告的那样.我已经把它归结为一个类泄漏了52个字节的115个实例.

坏演员的简要描述是:

TCwcBasicAdapter = class(TCwcCustomAdapter)  
  protected  
    FNavTitleField: TField;  
    function GetAdapterNav(aDataSet: TDataSet): ICwcCDSAdapterNav; override;  
  public  
    constructor Create(aDataSource: TDataSource; aKeyField,aNavTitleField: TField; aMultiple: boolean);  
  end;

界面是:

ICwcCDSAdapterNav = interface(IInterface)

我吵了一棵错误的树,因为这个属性被引用计算了吗?在任何情况下,接口属性都可以防止类被破坏吗?

以下是上述方法的实现:

function TCwcBasicAdapter.GetAdapterNav(aDataSet: TDataSet): ICwcCDSAdapterNav;
var
  AdapterNav: TCwcCDSAdapterNavBase;
begin
  result := nil;
  if Assigned(aDataSet) then begin
    AdapterNav := TCwcCDSAdapterNavBasic.Create(aDataSet,FKeyField.Index,FNavTitleField.Index);
    try
      AdapterNav.GetInterface(ICwcCDSAdapterNav,result);
    except
      FreeAndNil(AdapterNav);
      raise;
    end;
  end;
end;

将类声明为:

TCwcCDSAdapterNavBase = class(TInterfacedobject,ICwcCDSAdapterNav)

解决方法

FastMM应该为您提供泄漏的内容和创建的位置.
这将有助于将其缩小到真正的罪魁祸首:谁在泄漏什么?

我不确定你的问题到底是什么?
您的代码不完整或不是有问题的代码:您的类没有Interface属性,也没有Interface private Field,只是一个返回Interface的方法,它是无害的.

编辑:没有看到你的Object的代码实现ICwcCDSAdapterNav,我们无法判断它是否确实是引用计数.
如果你不是从TInterfacedobject下降,很可能它不是引用计数,你不能依赖于这种自动释放…

您可能需要查看此CodeRage 2会话:Fighting Memory Leaks for Dummies.它主要说明如何使用FastMM来防止/检测Delphi中的内存泄漏.适用于D2007,但仍适用于其他版本.

Delphi 7.0和内存泄漏?

Delphi 7.0和内存泄漏?

花了很多时间用FastMM4清除任何可能导致内存泄漏的代码片段,如FastMM4所示,我们已经在 Windows 7上测试运行我们的软件大约一个月了.这就是我目前所看到的我的软件过程的任务管理器.

> -cpu started out at 1% and 0%. Now it is bouncing around from 2% to 5%
> -VM usage started out at 11,852KB. Now it is at 4,900kb but bouncing
> around from 4,900kb to 5,000kb.

这是否意味着我们的软件中存在内存泄漏?我感到困惑和担忧.

提前致谢,

解决方法

这听起来像是非常正常的内存使用.该程序执行需要内存的操作,并且内存使用量会增加.该程序完成它正在做的事情并释放内存,内存使用率回落.内存泄漏是指内存使用率上升并持续上升,因为一旦完成内存,您就不会释放内存.

如果你有FastMM4,你不应该寻找可能导致内存泄漏的事情.只需启用完全调试模式和日志记录选项,它就会找到运行时泄漏的任何内存,并为您写出包含类型和堆栈跟踪的文件.

Delphi 7中使用WMI的内存泄漏

Delphi 7中使用WMI的内存泄漏

使用Delphi 7的WMI查询(远程)电脑时,遇到内存泄漏。 内存泄漏只发生在Windows 2003(和Windows XP 64)上。 Windows 2000是好的,Windows 2008也是如此。我想知道是否有人遇到类似的问题。

事实上,泄漏只发生在某些版本的Windows意味着它可能是一个Windows问题,但我一直在searchnetworking,一直没有能够find一个修复程序来解决问题。 另外,这可能是一个Delphi问题,因为在C#中具有类似function的程序似乎没有泄漏。 后一个事实使我相信,在Delphi中获得所需的信息可能还有另一种更好的方式,而不会发生内存泄漏。

我已经将源代码包含在一个小程序中,以显示下面的内存泄漏。 如果sObject.Path_下面的行{ Leak! } { Leak! }注释被执行,发生内存泄漏。 如果我把它评论出来,就没有泄漏。 (显然,在“真正的”程序中,我用sObject.Path_方法调用的结果做了一些有用的sObject.Path_ 。)

用我的机器上的一个简单的Windows任务pipe理器分析,发现了以下内容:

在Linux中有没有一个MDB(模块化debugging器)solaris相当于?

在linux下运行Drupal时出现内存泄漏apache,但同样的应用程序不会在windows服务器上泄漏mem

Memory.CreateBitmapSourceFromHBitmap中的内存泄漏

这个valgrind错误是什么意思?

使用MapViewOfFile,指针最终走出内存空间

在N = 100之前N = 500 N = 1000

sObject.Path_ 3.7M 7.9M 18.2M 31.2M

没有sObject.Path_ 3.7M 5.3M 5.4M 5.3M

我想我的问题是:有其他人遇到过这个问题吗? 如果是这样,是不是Windows的问题,是否有一个修补程序? 或者(更可能)是我的Delphi代码被破坏了,有没有更好的方法来获取我需要的信息?

你会注意到有几次, nil是分配给对象的,与Delphi精神相反……这些是不从TObjectinheritance的COM对象,也没有可以调用的析构函数。 通过给它们分配nil ,Windows的垃圾收集器清理它们。

program ConsoleMemoryLeak; {$APPTYPE CONSOLE} uses Variants,ActiveX,WbemScripting_TLB; const N = 100; WMIQuery = ''SELECT * FROM Win32_Process''; Host = ''localhost''; { Must be empty when scanning localhost } Username = ''''; Password = ''''; procedure ProcessObjectSet(WMIObjectSet: ISWbemObjectSet); var Enum: IEnumVariant; tempObj: OleVariant; Value: Cardinal; sObject: ISWbemObject; begin Enum := (wmiObjectSet._NewEnum) as IEnumVariant; while (Enum.Next(1,tempObj,Value) = S_OK) do begin sObject := IUnkNown(tempObj) as SWBemObject; { Leak! } sObject.Path_; sObject := nil; tempObj := Unassigned; end; Enum := nil; end; function ExecuteQuery: ISWbemObjectSet; var Locator: ISWbemLocator; Services: ISWbemServices; begin Locator := CoSWbemLocator.Create; Services := Locator.ConnectServer(Host,''rootCIMV2'',Username,Password,'''',nil); Result := Services.ExecQuery(WMIQuery,''WQL'',wbemFlagReturnImmediately and wbemFlagForwardOnly,nil); Services := nil; Locator := nil; end; procedure DoQuery; var ObjectSet: ISWbemObjectSet; begin CoInitialize(nil); ObjectSet := ExecuteQuery; ProcessObjectSet(ObjectSet); ObjectSet := nil; CoUninitialize; end; var i: Integer; begin WriteLn(''Press Enter to start''); ReadLn; for i := 1 to N do DoQuery; WriteLn(''Press Enter to end''); ReadLn; end.

内存debugging器与ptrace

Qt应用程序因为内存不足(OOM)

调查内存泄漏

由激活上下文引起的dynamic加载的DLL上的文件句柄泄漏

任务pipe理器不同意Process Explorer?

我可以重现的行为,代码泄漏在Windows XP 64上的内存,而不是在Windows XP上。 有趣的是,只有在读取Path_属性的情况下,才会发生这种情况,读取Properties_或Security_具有相同的代码不会泄漏任何内存。 WMI中特定于Windows版本的问题看起来是最可能的原因。 我的系统是最新的AFAIK,所以可能没有这个修补程序。

不过,我想评论一下你重置所有的变体和接口变量。 你写

你会注意到有几次,nil是分配给对象的,与Delphi精神相反……这些是不从TObject继承的COM对象,也没有可以调用的析构函数。 通过给它们分配nil,Windows的垃圾收集器清理它们。

这是不正确的,因此不需要将变量设置nil和Unassigned 。 Windows没有垃圾收集器,所涉及的是引用计数的对象,一旦引用计数达到0,就立即销毁引用计数的对象.Delphi编译器确实会插入必要的调用,以根据需要递增和递减引用计数。 您分配给nil和Unassigned任务递减引用计数,并在对象达到0时释放该对象。

一个新的赋值给一个变量,或者退出这个过程也会照顾到这个,所以额外的赋值(虽然没有错)是多余的,降低了代码的清晰度。 下面的代码是完全等效的,不会泄漏任何额外的内存:

procedure ProcessObjectSet(WMIObjectSet: ISWbemObjectSet); var Enum: IEnumVariant; tempObj: OleVariant; Value: Cardinal; sObject: ISWbemObject; begin Enum := (wmiObjectSet._NewEnum) as IEnumVariant; while (Enum.Next(1,Value) = S_OK) do begin sObject := IUnkNown(tempObj) as SWBemObject; { Leak! } sObject.Path_; end; end;

我会说,只有在实际上释放对象的情况下才能显式重置接口(所以当前的引用计数必须是1),并且销毁本身应该确切地发生在这一点上。 后者的例子是可以释放大量内存,或者需要关闭文件或释放同步对象。

你应该存储返回值

sObject.Path_;

在一个变量中,并使其成为SWbemObjectPath。 这是使参考计数正确的必要条件。

总结

以上是小编为你收集整理的Delphi 7中使用WMI的内存泄漏全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Delphi iOS & macOS App 名称支持国际化多语显示

Delphi iOS & macOS App 名称支持国际化多语显示

作用:在 OSX 图标下方显示 App 中文繁体或简体的名称(系统自动选取)

适用:XE7,XE8 for OSX

操作:

  1. 创建一个新工程。
  2. 在工程目录下创建二个文件夹(zh_??.lproj)文件(InfoPlist.strings)及内容:
  • zh_CN.lproj
    • InfoPlist.strings
    • CFBundleName =中文测试"; CFBundledisplayName = "中文测试";
  • zh_TW.lproj
    • InfoPlist.strings
    • CFBundleName =中文測試"; CFBundledisplayName = "中文測試";
    1. 接着将这二个目录下的InfoPlist.strings 加入工程里。

    2. 进入 Deployment 设定发布目录。

  • 运行它就能看到 App 中文名称:

  • iOS Deployment 参考:

    今天关于macos – Delphi REST mac内存泄漏mac内存溢出的介绍到此结束,谢谢您的阅读,有关Delphi 2009 – 接口属性是否会导致内存泄漏?、Delphi 7.0和内存泄漏?、Delphi 7中使用WMI的内存泄漏、Delphi iOS & macOS App 名称支持国际化多语显示等更多相关知识的信息可以在本站进行查询。

    本文标签:

    上一篇如何在Delphi XE7中设置“版本信息”? [德尔福设计问题](delphi de2-7wj)

    下一篇Delphi汇编数组访问(delphi 汇编)