仮想バイトを増やす操作と機能
-
21-09-2019 - |
質問
Windowsの32ビットプロセスでいくつかのメモリの問題があるため、パフォーマンスモニターを使用してそのプロセスの特定のカウンターを記録し始めました。
仮想バイトがプライベートバイトと作業セットの両方よりも高いことは正常ですが、私の場合、実質的な違いがあることがわかりました、仮想バイトは 多くの プライベートバイトと作業セットの両方よりも高い。
どの特定の操作とWin32/CRT関数(CまたはC ++)は仮想バイトを増加させますが、プライベートバイトと作業セットは増加しませんか?
パフォーマンスモニターのさまざまなカウンターの説明を理解していれば、何らかの共有リソースになると思います。
ウィンドウの同じリリースのさまざまなアプリケーションで、さまざまなアプリケーションでさまざまなリリースでメモリカウンターに使用する命名規則に(控えめに言っても)混乱があるように思われるため、次のものをまとめました。
MSDNからの情報
によると MSDN-ウィンドウリリースのメモリ制限, 、32ビットプロセスごとに32ビットウィンドウのユーザーモード仮想アドレススペース制限は、通常2 GBです。で最大3 GBにすることができます IMAGE_FILE_LARGE_ADDRESS_AWARE
と 4GT
.
以下は、パフォーマンスモニターのさまざまなカウンターと、タスクマネージャーの対応する列と、情報を保持するWin32構造の説明です。 MSDN-メモリパフォーマンス情報.
仮想バイト
仮想バイトは、プロセスが使用している仮想アドレス空間の電流サイズです。仮想アドレススペースの使用は、必ずしもディスクまたはメインメモリページのいずれかの使用を意味するものではありません。仮想空間は有限であり、プロセスはライブラリをロードする機能を制限できます。
タスクマネージャーXP:n/a
タスクマネージャーVista:n/a
構造: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual
プライベートバイト
プライベートバイトは、このプロセスが割り当てられたメモリの現在のサイズであり、他のプロセスと共有できません。
タスクマネージャーXP:VMサイズ
タスクマネージャーVista:コミットサイズ
構造: PROCESS_MEMORY_COUNTERS_EX.PrivateUsage
ワーキングセット
作業セットは、このプロセスの作業セットの現在のサイズのバイトです。作業セットは、プロセスのスレッドによって最近触れられたメモリページのセットです。コンピューターの自由メモリがしきい値を超えている場合、ページは使用されていない場合でも、プロセスの作業セットに残されています。フリーメモリがしきい値を下回ると、ページはワーキングセットからトリミングされます。それらが必要な場合、それらはメインメモリを離れる前に、作業セットにソフトフォールされます。
タスクマネージャーXP:MEMの使用
タスクマネージャーVista:ワーキングセット
構造: PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize
解決
プライベートバイトを増やすことなく仮想バイトを増やすことができるものは、私が今考えることができる:
バイナリはしばしば共有されます(つまり、プライベートではありません)が、重要な住所スペースを占有します。これはバイナリのサイズよりもさらに大きくなる可能性があります
VirtualAllocを使用して、コミット /アクセスせずに順次アドレス空間を予約します。カスタムメモリマネージャーはそうするかもしれません。
メモリマップされたファイルを使用して(完全にアクセスすることなく)
他のヒント
VirtualAllocを使用することにより、実際に物理メモリを割り当てることなく、仮想アドレス空間を割り当てることができます。これにより、「仮想バイト」カウントが増加するはずですが、作業セットサイズではありません。
メモリのないものは、アドレススペースをあまりにも多くのアドレススペースを確保するため、アドレススペースの実行によって引き起こされる可能性があります。
あなたのプログラミング言語は何ですか?
管理されたフレームワークでは、プライベートバイトは、管理されていないリソースによって割り当てられるデータを表します。一方、仮想バイトは、メモリの合計使用量(管理されていないデータと管理されたデータ)を表します。
したがって、このようなフレームワークでプライベートバイトと仮想バイトの間に大きな違いがあることが非常に一般的です。