我使用的代码库包含一个函数来计算可用的内存量。
对于托管PC(由Windows 2008 R2 x64托管),我有时会看到以有趣的方式计算的免费金额。
报告为
物理内存:1400/1400 MB(免费/总计)
由于有几个应用程序正在运行,因此无法实现。怎么会发生这种情况?
我感兴趣的是这种现象是否指向记忆问题。有时我的应用程序在托管在具有有限内存(如1400 MB)的VM上时内存不足。因此,当我看到一个错误报告时,错误报告的可用计量为1400 MB,那么它真的是零吗?
这是代码
function GetMemoryStatus : UnicodeString;
type
TMemoryStatusEx = record
dwLength : dword;
dwMemoryLoad : dword;
ullTotalPhys : int64;
ullAvailPhys : int64;
ullTotalPageFile : int64;
ullAvailPageFile : int64;
ullTotalVirtual : int64;
ullAvailVirtual : int64;
ullAvailExtendedVirtual : int64;
end;
var gmse : function (var mse: TMemoryStatusEx) : bool; stdcall;
ms : TMemoryStatus;
mse : TMemoryStatusEx;
begin
gmse := GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx');
if @gmse <> nil then begin
mse.dwLength := sizeOf(mse);
gmse(mse);
end else begin
ms.dwLength := sizeOf(ms);
GlobalMemoryStatus(ms);
mse.ullAvailPhys := ms.dwAvailPhys;
mse.ullTotalPhys := ms.dwTotalPhys;
end;
result := IntToStrExW((mse.ullAvailPhys + $80000) div $100000) + '/' +
IntToStrExW((mse.ullTotalPhys + $80000) div $100000) + ' MB (free/total)';
end;
谢谢! 雅各布
答案 0 :(得分:1)
我无法重现你的问题。唯一的区别是你在Result
行中进行的计算有一些变化,因为我现在没有使用MadExcept(很快就会纠正)。这是我使用的代码:
type
TMemoryStatusEx = record
dwLength : dword;
dwMemoryLoad : dword;
ullTotalPhys : int64;
ullAvailPhys : int64;
ullTotalPageFile : int64;
ullAvailPageFile : int64;
ullTotalVirtual : int64;
ullAvailVirtual : int64;
ullAvailExtendedVirtual : int64;
end;
type
TGlobalMemoryStatusEx = function (var mse: TMemoryStatusEx) : bool; stdcall;
function GetMemoryStatus : string;
var
GlobalMemoryStatusEX: TGlobalMemoryStatusEx;
MemStatEx : TMemoryStatusEx;
begin
GlobalMemoryStatusEx := GetProcAddress(GetModuleHandle(kernel32),
'GlobalMemoryStatusEx');
if @GlobalMemoryStatusEx <> nil then
begin
MemStatEx.dwLength := sizeOf(MemStatEx);
GlobalMemoryStatusEx(MemStatEx);
Result := Format('%d / %d KB (free/total), ',
[MemStatEx.ullAvailPhys div 1024,
MemStatEx.ullTotalPhys div 1024 ]);
end;
end;
procedure TForm3.FormShow(Sender: TObject);
begin
Label1.Caption := GetMemoryStatus;
end;
这是应用程序的输出(在其下面有任务管理器的物理内存窗格用于比较),在Windows 7上的Windows XP Mode虚拟机中运行。虚拟机设置了1GB的RAM,并且有这个测试应用程序,任务管理器,以及运行的单个Windows资源管理器实例。 (该应用程序在D2007中以Win 7 64位编写,然后复制/粘贴到VM中,然后双击资源管理器启动。)