我有一个Delphi程序,我正在研究这个程序如何在日志文件中打印自己的“虚拟大小”,以便我可以看到它何时使用了太多内存。如何使用Delphi代码确定“虚拟大小”?
“虚拟大小”是指Process Explorer显示的值。普通任务管理器无法显示此值。它不是程序的内存使用,而是地址空间的使用。在Win32上,程序不能使用超过2 GB的地址空间。
PS:我正在使用Delphi 6,但其他版本的代码/信息也应该没问题。
答案 0 :(得分:10)
由于这个post提供了有关如何使用C / C ++获取虚拟大小的提示,我能够编写以下Delphi函数:
Type
TMemoryStatusEx = packed record
dwLength: DWORD;
dwMemoryLoad: DWORD;
ullTotalPhys: Int64;
ullAvailPhys: Int64;
ullTotalPageFile: Int64;
ullAvailPageFile: Int64;
ullTotalVirtual: Int64;
ullAvailVirtual: Int64;
ullAvailExtendedVirtual: Int64;
end;
TGlobalMemoryStatusEx = function(var MSE: TMemoryStatusEx): LongBool; stdcall;
function VirtualSizeUsage: Int64;
var MSE: TMemoryStatusEx;
fnGlobalMemoryStatusEx: TGlobalMemoryStatusEx;
begin
Result := 0;
@fnGlobalMemoryStatusEx := GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx');
if Assigned(@fnGlobalMemoryStatusEx) then
begin
MSE.dwLength := SizeOf(MSE);
if fnGlobalMemoryStatusEx(MSE) then
Result := MSE.ullTotalVirtual-MSE.ullAvailVirtual;
end;
end;
它似乎对我很有用(Delphi 6,Win XP)。使用GlobalMemoryStatus代替GlobalMemoryStatusEx可能会有一个更简单的解决方案,但在内存超过2 GB的系统上无法正常运行。
答案 1 :(得分:6)
流程资源管理器seems通过调用NtQueryInformation来执行此操作,但也可以使用效果数据,请参阅我的回答here中的GetProcessVirtualBytes
。
答案 2 :(得分:1)
对于那些已经依赖其他优秀Jedi Code Library的人,您可以在JclWin32单元中找到@Name正确指出的定义。
您需要的实际数字也可以作为JclSysInfo单元中的单个函数进行细分。只需调用GetTotalVirtualMemory() - GetFreeVirtualMemory()即可进行计算。