我们有一个D2007应用程序,在Windows Server 2008(x64,sp1)上运行时,其内存占用量稳步增长.
它在Windows Server 2003(x32或x64),XP等上正常运行…它按预期上下运行.
我们尝试使用随附的内存管理器或最新的FastMM4 4.92,结果相同.
它在Windows Server 2003(x32或x64),XP等上正常运行…它按预期上下运行.
我们尝试使用随附的内存管理器或最新的FastMM4 4.92,结果相同.
有没有人试图在Win2008上监控任何Delphi应用程序的内存使用情况并确认?
或者有任何线索?
精度:
– 常识中没有内存泄漏(是的,我对FastMM等很熟悉)
– 使用Process Explorer监视内存使用情况;在Win2008上,虚拟内存(专用字节)和物理内存(WorkingSet Private)都在增长
– 即使存在内存压力,内存消耗仍在增长. (这就是我们如何调查,因为它导致了失败,但只在Win2008盒子上)
更新:// ** repaced ** //代码比我们的应用程序简单得多,但显示相同的行为.
创建10,000,000个对象的列表,然后10,000个接口,执行2次,使用的内存增加约60MB,在Windows Server 2008上再增加100次,大约增加300MB,但只返回XP上的位置.
如果启动多个实例,则不会释放内存以允许其他实例运行.相反,页面文件增长,服务器爬行…
更新2:见QC report 73347
经过进一步调查后,我们将其追踪到关键部分,如下面的代码所示.
将该代码放入带有Button的简单VCL应用程序中.并使用Process Explorer进行监控:
它从~2.6 MB开始,经过5次运行(点击按钮)后它保持在~118.6MB.
在5次处决中损失了116MB.
//*********************** const CS_NUMBER = 10000000; type TCSArray = Array[1..CS_NUMBER] of TRTLCriticalSection; PCSArray = ^TCSArray; procedure TestStatic; var csArray: PCSArray; idx: Integer; begin New(csArray); for idx := 1 to length(csArray^) do InitializeCriticalSection(csArray^[idx]); for idx := 1 to length(csArray^) do DeleteCriticalSection(csArray^[idx]); Dispose(csArray); end; procedure TestDynamic(const Number: Integer); var csArray: array of TRTLCriticalSection; idx: Integer; begin SetLength(csArray,Number); for idx := Low(csArray) to High(csArray) do InitializeCriticalSection(csArray[idx]); for idx := Low(csArray) to High(csArray) do DeleteCriticalSection(csArray[idx]); end; procedure TForm4.Button1Click(Sender: TObject); begin ReportMemoryLeaksOnShutdown := True; TestStatic; TestDynamic(CS_NUMBER); end;
有一个名为
VMMap的新sysinternals工具可视化分配的内存.也许它可以向你展示大内存块是什么.