Virtual Bytes と PowerShell

Virtual Bytes」とは、パフォーマンスモニタでログを取ることのできるカウンターの一種で、プロセスが使用している仮想アドレス領域の現在の大きさを、バイト数で表します。

(パフォーマンスモニタの詳細な使い方や、「そもそも 仮想アドレス領域 とは何か」という説明は割愛します。)

 

 

今回の主題は、パフォーマンスモニタではなく PowerShell の「Get-Process」コマンドレットを用いて Virtual Bytes の値を確認する際の注意点です。

 

 

コマンドレット例をできるだけシンプルに書くと、こんな感じです。

Get-Process  -name (プロセス名) |  Format-List VirtualMemorySize

※ PowerShell 1.0 でも実行可能です。

※ svchost.exe のように同名で複数存在するプロセスのうち一つだけを指定する場合は、-name ではなく -id によりプロセス固有の「プロセス ID」を指定する必要があります。

 

 

ところが、これでは 64 bit 版の OS に通用しない事があるのです。

値が小さいうちはいいのですが、だいたい 2 GB を超えたぐらいから、なぜかマイナスの値が出てきてしまいます。

(32 bit 版 の OS においては、仮想アドレス領域の上限はデフォルトで「2GB」ですから、そのせいではないかと推測しています。)

 

 

こんな時には、切り出すプロパティを変更します。

Get-Process  -name (プロセス名) |  Format-List VirtualMemorySize64

を実行することで、パフォーマンスモニタ側の「Virtual Bytes」と同じ値を確認出来ます。

名前からして、この「VirtualMemorySize64」こそが 64 bit 環境において確認すべき正しいプロパティなのでしょう。

 

 

 

なお、仮想メモリ領域が徐々に食い潰されていく(パフォーマンスモニタ上で「Virtual Bytes」の値が右肩上がりに上昇していく)様子を確認するには、下記の不具合を利用するという手が有ります。

The handle count and “Virtual Bytes” for the Windows Event Log service keep increasing in Windows Server 2008 or in Windows Vista when you refresh scheduled task history events

 

 

2013 年 12 月 22 日 現在、まだ日本語版のページが作られていません・・・

が、この現象を発生させるのは簡単です。

タスクスケジューラー上で何らかのタスクの「履歴」タブを開き、[最新の情報に更新] ボタンを連打するだけです。

 

 

なお、この不具合は Windows Vista および Windows Server 2008 で発生するものとされ、修正プログラムも出ているのですが、私は Windows 7 でも同様の現象が起きる事を確認しています。

Windows 7  向けの修正プログラムはいつ出るのでしょう・・・