3

Windowsの32ビットプロセスでメモリ不足の問題が発生したため、パフォーマンスモニターを使用してそのプロセスの特定のカウンターをログに記録し始めました。

仮想バイトがプライベートバイトとワーキングセットの両方よりも高いのは正常ですが、私の場合、仮想バイトはプライベートバイトとワーキングセットの両方よりもはるかに高いことがわかりました。

どの特定の操作とWin32/CRT関数(CまたはC ++)は、仮想バイトを増やしますが、プライベートバイトとワーキングセットは増やしませんか?

パフォーマンスモニターのさまざまなカウンターの説明を理解していれば、それはある種の共有リソースになると思います。


異なるリリースのWindowsのメモリカウンター、および同じリリースのWindowsの異なるアプリケーションで使用する命名規則には、(控えめに言っても)多少の混乱があるように思われるので、次のようにまとめました。

MSDNからの情報

MSDN-Windowsリリースのメモリ制限によると、32ビットプロセスごとの32ビットWindowsのユーザーモード仮想アドレス空間の制限は通常2GBです。IMAGE_FILE_LARGE_ADDRESS_AWAREおよびを使用して最大3GBにすることができます4GT

以下は、 MSDN-メモリパフォーマンス情報によると、パフォーマンスモニターのさまざまなカウンターと、タスクマネージャーの対応する列および情報を保持するWin32構造の説明です。

仮想バイト

Virtual Bytesは、プロセスが使用している仮想アドレス空間の現在のサイズ(バイト単位)です。仮想アドレス空間の使用は、必ずしもディスクまたはメインメモリページの対応する使用を意味するわけではありません。仮想空間は有限であり、プロセスはライブラリをロードする能力を制限する可能性があります。

タスクマネージャーXP:N / A
タスクマネージャーVista:N / A
構造:MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual

プライベートバイト

Private Bytesは、他のプロセスと共有できない、このプロセスが割り当てたメモリの現在のサイズ(バイト単位)です。

タスクマネージャーXP:VMサイズ
タスクマネージャーVista:コミットサイズ
構造:PROCESS_MEMORY_COUNTERS_EX.PrivateUsage

ワーキングセット

ワーキングセットは、このプロセスのワーキングセットの現在のサイズ(バイト単位)です。ワーキングセットは、プロセス内のスレッドが最近アクセスしたメモリページのセットです。コンピューターの空きメモリがしきい値を超えている場合、ページは使用されていなくてもプロセスのワーキングセットに残ります。空きメモリがしきい値を下回ると、ページはワーキングセットから削除されます。それらが必要な場合は、メインメモリを離れる前にワーキングセットにソフトフォールトされます。

タスクマネージャーXP:Memの使用法
タスクマネージャーVista:ワーキングセット
の構造:PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize

4

3 に答える 3

2

私が今考えることができるプライベートバイトを増やすことなく仮想バイトを増やす(かもしれない)こと:

  • バイナリは共有されることがよくありますが(つまり、プライベートではありません)、かなりのアドレス空間を占有します。これは、バイナリのサイズよりもさらに大きくなる可能性があります

  • VirtualAllocを使用して、コミット/アクセスせずに順次アドレス空間を予約します。カスタムメモリマネージャがそれを行う場合があります。

  • メモリマップトファイルを使用する(完全にアクセスせずに)

于 2009-10-17T12:35:55.760 に答える
1

VirtualAllocを使用すると、実際に物理メモリを割り当てることなく、仮想アドレス空間を割り当てることができます。これにより、「仮想バイト」数は増加しますが、ワーキングセットのサイズは増加しません。

アドレス空間の予約が多すぎるため、アドレス空間の実行が原因でメモリが不足している可能性があります。

于 2009-10-17T11:44:27.923 に答える
0

あなたのプログラミング言語は何ですか?

マネージドフレームワークでは、プライベートバイトはアンマネージドリソースによって割り当てられたデータを表します。一方、仮想バイトは合計メモリ使用量(管理されていないデータと管理されているデータ)を表します。

したがって、このようなフレームワークでは、プライベートバイトと仮想バイトの間に大きな違いが見られることがよくあります。

于 2009-10-17T11:01:18.837 に答える