【问题标题】:Determining process virtual size using delphi使用delphi确定进程虚拟大小
【发布时间】:2011-12-30 10:27:27
【问题描述】:

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

“虚拟大小”是指Process Explorer 显示的值。普通任务管理器无法显示此值。它不直接是程序的内存使用量,而是地址空间使用量。在 Win32 上,程序不能使用超过 2 GB 的地址空间。

PS:我使用的是 Delphi 6,但其他版本的代码/信息也应该没问题。

【问题讨论】:

  • 在 64 位 Windows 上,使用 LARGEADDRESSAWARE,32 位进程可以使用 4GB 虚拟地址空间。在 D6 上,由于 Borland MM 中的错误,您需要切换 MM(例如切换到 FastMM)才能完成这项工作。

标签: windows delphi delphi-6


【解决方案1】:

Process Explorer seems 可以通过调用 NtQueryInformation 来完成,但也可以使用性能数据,请参阅我的回答 here 中的 GetProcessVirtualBytes

【讨论】:

  • +1 感谢您的快速回答。我没有尝试过,因为我同时找到了另一种方法,但这似乎是一个很好的解决方案。
  • @Name 欢迎使用,此方法仅在查询外部进程时需要。正如我在对您自己的回答的评论中所说,如果您只是在寻找有关您自己的流程的信息,您的解决方案是最好的。
【解决方案2】:

感谢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 的系统上无法正常工作。

【讨论】:

    【解决方案3】:

    对于那些已经依赖于其他出色的Jedi Code Library 的人,您可以在JclWin32 单元中找到@Name 正确指出的定义。

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

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2011-03-25
      • 2011-01-12
      • 1970-01-01
      • 2018-03-26
      • 2016-09-26
      相关资源
      最近更新 更多