使用delphi确定进程虚拟大小



我有一个Delphi程序,我正在看这个程序如何在日志文件中打印自己的"虚拟大小",以便我可以看到它何时使用了太多的内存。如何使用Delphi代码确定"虚拟大小"?

这里的"虚拟大小"是指进程资源管理器显示的值。普通任务管理器无法显示此值。它不是程序内存的直接使用,而是地址空间的使用。在Win32上,一个程序不能使用超过2gb的地址空间。

PS:我正在使用Delphi 6,但其他版本的代码/信息也应该可以。

多亏这篇文章给出了如何使用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可能有一个更简单的解决方案,但它在内存超过2gb的系统上无法正常工作。

进程资源管理器似乎通过调用NtQueryInformation来做到这一点,但也可以使用性能数据,参见我在这里的回答中的GetProcessVirtualBytes

对于那些已经依赖于优秀的Jedi代码库的人来说,您可以在JclWin32单元中找到@Name正确指出的定义。

您需要的实际数字也被分解为JclSysInfo单元中的单个函数。只需调用GetTotalVirtualMemory()- getfrevirtualmemory()来进行计算。

最新更新