对于在Windows Server 2008(sp1)上运行的Delphi应用程序,内存是否未被回收?

前端之家收集整理的这篇文章主要介绍了对于在Windows Server 2008(sp1)上运行的Delphi应用程序,内存是否未被回收?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个D2007应用程序,在Windows Server 2008(x64,sp1)上运行时,其内存占用量稳步增长.
它在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工具可视化分配的内存.也许它可以向你展示大内存块是什么.
原文链接:https://www.f2er.com/windows/372076.html

猜你在找的Windows相关文章