6

私は Delphi プログラムを持っており、このプログラムが独自の「仮想サイズ」をログ ファイルに出力する方法を調べているので、メモリを使いすぎた時期を確認できます。Delphi コードを使用して「仮想サイズ」を決定するにはどうすればよいですか?

「仮想サイズ」とは、Process Explorerによって表示される値を意味します。この値は、通常のタスク マネージャーでは表示できません。プログラムの直接的なメモリ使用量ではなく、アドレス空間の使用量です。Win32 では、プログラムは 2 GB を超えるアドレス空間を使用できません。

PS: 私は Delphi 6 を使用していますが、他のバージョンのコード/情報も問題ないはずです。

4

3 に答える 3

10

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)。GlobalMemoryStatusExの代わりにGlobalMemoryStatusを使用するより簡単な解決策があるかもしれませんが、2 GB を超えるメモリを搭載したシステムでは正しく機能しません。

于 2011-11-16T13:49:40.450 に答える
6

Process ExplorerはNtQueryInformationを呼び出すことでそれを行うようですが、パフォーマンス データを使用することも可能です。私の回答hereを参照してください。GetProcessVirtualBytes

于 2011-11-16T13:44:45.560 に答える