加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 查找最大的空闲内存块

发布时间:2020-12-15 09:09:06 所属栏目:大数据 来源:网络整理
导读:当碎片化时,有时会出现内存不足的问题. 是否有可能找到最大的可用内存块? 我使用Delphi 2007和FastMM.在Windows 2003上运行应用程序的Windows XP上进行开发. 问候 编辑: 我可以在Windows Server 2003 x64上添加应用程序在具有32 GB内存的服务器上运行的信
当碎片化时,有时会出现内存不足的问题.

是否有可能找到最大的可用内存块?
我使用Delphi 2007和FastMM.在Windows 2003上运行应用程序的Windows XP上进行开发.

问候

编辑:
我可以在Windows Server 2003 x64上添加应用程序在具有32 GB内存的服务器上运行的信息.但该应用程序是一个32位应用程序,因此每个实例的理论最大分配内存为2 GB.许多实例立即运行.我认为总体物理记忆不是很少.我想在启动时应用程序获得了32位虚拟内存空间.这可能在运行时期间过于分散.

我还发现了FastGetHeapStatus方法,该方法返回一个THeapStatus,其中包含一些可用内存字段.也许我可以使用那些.

EDIT2:
我发现这个How to get the largest available continues memory block.
代码是C但也许可以翻译成Delphi.

解决方法

这是您想要的Delphi代码的翻译:

function GetLargestFreeMemRegion(var AAddressOfLargest: pointer): LongWord;
var
  Si: TSystemInfo;
  P,dwRet: LongWord;
  Mbi: TMemoryBasicInformation;
begin
  Result := 0;
  AAddressOfLargest := nil;
  GetSystemInfo(Si);
  P := 0;
  while P < LongWord(Si.lpMaximumApplicationAddress) do begin
    dwRet := VirtualQuery(pointer(P),Mbi,SizeOf(Mbi));
    if (dwRet > 0) and (Mbi.State and MEM_FREE <> 0) then begin
      if Result < Mbi.RegionSize then begin
        Result := Mbi.RegionSize;
        AAddressOfLargest := Mbi.BaseAddress;
      end;
      Inc(P,Mbi.RegionSize);
    end else
      Inc(P,Si.dwPageSize);
  end;
end;

你可以像这样使用它:

procedure TForm1.FormCreate(Sender: TObject);
var
  BaseAddr: pointer;
  MemSize: LongWord;
begin
  MemSize := GetLargestFreeMemRegion(BaseAddr);
  // allocate dynamic array of this size
  SetLength(fArrayOfBytes,MemSize - 16);

  Caption := Format('Largest address block: %u at %p; dynamic array at %p',[MemSize,BaseAddr,pointer(@fArrayOfBytes[0])]);
end;

请注意,我必须从最大大小中减去16个字节,大概是因为动态数组本身使用了从同一块内存中分配的几个字节,因此下一个分配基于16的下一个倍数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读