Tag: delphi xe2 win64

线程closures期间Win64 Delphi RTL中的内存泄漏?

很长一段时间,我注意到我的服务器应用程序的Win64版本泄漏内存。 虽然Win32版本在相对稳定的内存占用情况下工作正常,但是64位版本使用的内存有规律地增加 – 也许20Mb /天,没有任何明显的原因(不用说,FastMM4没有报告任何内存泄漏) 。 源代码在32位和64位版本之间是相同的。 该应用程序是围绕Indy TIdTCPServer组件构build的,它是一个连接到数据库的高度multithreading服务器,该数据库处理由Delphi XE2制作的其他客户端发送的命令。 我花了很多时间审查我自己的代码,并试图了解为什么64位版本泄漏了这么多的内存。 我最终通过使用MS工具来追踪DebugDiag和XPerf之类的内存泄漏,似乎在Delphi 64位RTL中存在一个根本的缺陷,每当线程从DLL中分离出来,都会导致一些字节被泄漏。 此问题对于必须全天候运行而不重新启动的高度multithreading应用程序尤其关键。 我用由XE2构build的主机应用程序和库组成的非常基本的项目重现了这个问题。 该DLL与主机应用程序静态链接。 主机应用程序创build线程,只是调用虚拟导出的过程并退出: 这里是库的源代码: library FooBarDLL; uses Windows, System.SysUtils, System.Classes; {$R *.res} function FooBarProc(): Boolean; stdcall; begin Result := True; //Do nothing. end; exports FooBarProc; 主机应用程序使用计时器来创build一个只调用导出过程的线程: TFooThread = class (TThread) protected procedure Execute; override; public constructor Create; end; … function FooBarProc(): […]