使用delphi确定进程的虚拟大小

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

“虚拟大小”是指Process Explorer显示的值。 这个值不能由普通的任务pipe理器显示。 这不是程序的内存使用,而是地址空间的使用。 在Win32上,程序不能使用超过2 GB的地址空间。

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(GetmoduleeHandle(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内存的系统上将无法正常工作。

Process Explorer 似乎通过调用NtQueryInformation来实现,但也可以使用性能数据,请参阅我的答案中的GetProcessVirtualBytes

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

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