Определение виртуального размера процесса с использованием delphi - PullRequest
6 голосов
/ 16 ноября 2011

У меня есть программа Delphi, и я смотрю, как эта программа может печатать свой собственный «виртуальный размер» в файле журнала, чтобы я мог видеть, когда он использовал слишком много памяти. Как я могу определить «виртуальный размер» с помощью кода Delphi?

Под «виртуальным размером» я подразумеваю значение, отображаемое Process Explorer . Это значение не может быть отображено обычным диспетчером задач. Это не непосредственно использование памяти программой, а использование адресного пространства. На Win32 программа не может использовать более 2 ГБ адресного пространства.

PS: я использую Delphi 6, но код / ​​информация для других версий тоже должна быть в порядке.

Ответы [ 3 ]

10 голосов
/ 16 ноября 2011

Благодаря этой публикации , в которой даются советы о том, как получить виртуальный размер с помощью 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 ГБ.

6 голосов
/ 16 ноября 2011

Process Explorer кажется, делает это, вызывая NtQueryInformation , но также возможно использовать данные о производительности, см. GetProcessVirtualBytes в моем ответе здесь .

1 голос
/ 17 ноября 2011

А для тех, кто уже зависит от превосходной Библиотеки кодов джедаев , вы можете найти определения, которые @Name правильно указывает выше в блоке JclWin32 .

Фактические цифры, которые вам нужны, также выделены как отдельные функции в блоке JclSysInfo . Просто вызовите GetTotalVirtualMemory () - GetFreeVirtualMemory (), чтобы выполнить расчет.

...