当碎片化时,有时会出现内存不足的问题. 是否有可能找到最大的可用内存块? 我使用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的下一个倍数.
