2016-10-18 20 views
0

私はDelphi 2007を使用しているため、32ビットの使用可能メモリの制限があります。プロセス用に使用可能なメモリを取得する

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} // Allows usage of more than 2GB memory 

これは私は、プロセスの現在のメモリ使用状況を取得するために使用する方法であって:

function MemoryUsed: Int64; 
var 
    PMC: _PROCESS_MEMORY_COUNTERS_EX; 
begin 
    Win32Check(GetProcessMemoryInfo(GetCurrentProcess, @PMC, SizeOf(PMC))); 
    Result := PMC.PrivateBytes; 
end; 
IMAGE_FILE_LARGE_ADDRESS_AWARE PEフラグを使用

、代わりに2ギガバイトの制限3ギガバイトがあるはず

これで、プロセスに使用可能なメモリの合計量を取得する方法が必要になりました。約3 GBにする必要があります。しかし、私はそれをハードコードしたくありません。将来、新しいDelphiと64ビットに移行する予定です。

私はどのWin32 API関数を使用しますか?

利用可能なメモリ - 利用可能なコンピュータ - おそらく8 GBのRAMがインストールされている可能性があります。さらに必要な場合、OSはメモリをディスクにスワップします。

処理可能なメモリ - 実行可能ファイルとWindowsの制限。現在、ほとんどのWindowsは64ビットなので、問題はありません。しかし、実行可能ファイルがIMAGE_FILE_LARGE_ADDRESS_AWAREで32ビットとしてコンパイルされている場合、制限は3 GBにする必要があります。実行可能ファイルが64ビットであれば、それははるかに大きく、おそらく64GBになります(ただし、インストールされているRAMが少なくてもスワッピングが発生する可能性があります)。

私の質問は、どのようにプロセスの使用可能なメモリを取得できますか?

+1

使用可能なメモリを定義してください。あなたのプロセスは64ビットシステム上で完全な4GBのアドレス空間を使うことができます。それは、現在予約されていない、与えている、または取っているすべてのスペースを割り当てることができます。とにかく情報で何をするつもりですか? –

+0

私は質問 –

+0

を明確にしようとしています。それであなたが望むアドレス空間の量です。 2、3、または4のいずれかです。3とは考えにくい。最近、/ 3gbスイッチで起動する多くの32ビットシステムが見つかりません。 –

答えて

1

あなたにできることはいくつかあります。 GetSystemInfoに電話し、lpMaximumApplicationAddressからlpMinimumApplicationAddressを引いて、ご使用のプロセスで使用可能なアドレス空間の量を探します。

利用可能な物理メモリの量は、取得するのがはるかに難しく、固定量ではありません。他のすべてのプロセスと競合しているので、これは非常に流動的でダイナミックなコンセプトです。 GlobalMemoryStatusExを呼び出すことによって、システム上で利用可能な物理メモリの量を知ることができます。それは他の情報も返しますが、誤って解釈するのは非常に簡単です。実際にこのAPIは、あなたのプロセスに利用可能な仮想メモリの量を示して、最初の段落と同じ情報を提供します。

おそらく、物理メモリと合計仮想メモリの総量の最小値が必要です。しかし私は言うことを好まない。私は、誤って解釈されたメモリ統計に基づいて悪い決定を行うことによって実行する能力を不必要に制限する多くのコード例を見てきました。

+0

lpMaximumApplicationAddressにしてください。 – Fritzw

関連する問題