我使用一个包含函数的代码库来计算可用的内存量。
对于托pipePC(由Windows 2008 R2 x64托pipe),我有时会看到以有趣的方式计算的免费金额。
它被报告为
物理内存:1400/1400 MB(免费/总计)
这真的是真的,因为几个应用程序正在运行。 这怎么可能发生?
我的兴趣在于这个现象是否指向记忆问题。 有时我的应用程序在内存有限的内存(如1400 MB)上运行时内存不足。 所以当我看到一个错误报告,错误地报告了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;
谢谢! 雅各
我无法重现你的问题。 唯一的区别是你在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(GetmoduleeHandle(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资源管理器实例。 (该应用程序是在Win7 64位的D2007中编写的,然后复制/粘贴到VM中,然后双击Explorer启动。)