System.Diagnostics.Processにあるメモリ関係のプロパティを見ていたら、よく分からなくなってきたので、整理を兼ねてメモしておく。
メモリ
プロセスが使用しているメモリには、OSが管理するメモリ領域と、プログラムが使用するメモリ領域の2つがある。
OSが使用するメモリ領域
OSが使用するメモリ領域には、ページング化なエリアと、不可なエリアが存在する。
Process.NonpagedSystemMemorySize: ページングされないシステム メモリの量 Process.PagedSystemMemorySize : ページング可能なシステム メモリの量 |
作成したプログラムのリソースリークを監視する際、このメモリはアプリから管理不可能な領域なので、
一般的には見なくて良い(はず)。
プログラムが使用するメモリ領域
プログラムが使用するメモリ領域はページング可能
プログラムが使用するメモリ領域は、プログラム側からは仮想アドレス空間として認識できる。
ページングの観点からメモリを見ると、仮想アドレスサイズ(Process.VirtualMemorySize)には以下の2つが存在する。
1.ページングファイル (Process.PagedMemorySize) 2.物理メモリ |
ワーキングセット
物理 RAM メモリ内でプロセスが現在参照できるメモリページのセットのこと。
ワーキングセットは物理メモリ上に存在していて、このデータを参照するときにページ フォルトを起こすことはない。
ワーキング セットのメモリは、使用されているメモリとは限らない(直前まで使用可能だったが、GCされて無い領域も含む)
ワーキングセット(Process.WorkingSet)は、以下の2つで構成される
1.共有データ 2.プライベート データ (Process.PrivateMemorySize) |
共有データには、プログラムのコード等が含まれている
プライベートデータは、変数の値などの複数のプロセスで共有できない情報が入っている。
※ちなみに、VirtualMemorySize = PagedMemorySize + WorkingSetではないので注意。
(実測して確認した結果では、2つの和よりVirtualMemorySizeの方が大きかった)
プログラムが使用したメモリ領域の最大値
以下のメモリサイズのhighwatermark値はシステム側で監視しているので、それぞれ取得する事が可能。
Process.PagedMemorySize の最大値 -> Process.PeakPagedMemorySize Process.VirtualMemorySize の最大値 -> Process.PeakVirtualMemorySize Process.WorkingSet の最大値 -> Process.PeakWorkingSet |
関連記事
コメントを残す