当碎片化时,有时会出现内存不足的问题. 是否有可能找到最大的可用内存块? 我使用Delphi 2007和FastMM.在Windows 2003上运行应用程序的Windows XP上进行开发. 问候 编辑: 我可以在Windows Serv
是否有可能找到最大的可用内存块?
我使用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.
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的下一个倍数.