PowerShellで各プロセスのメモリ使用量取得
エンジニアあるあるかもしれませんが、ブラウザのタブをめっちゃ開いていたり、いろんなツールを立ち上げっぱなしにしてたり
そんなことをしているとわりとメモリ食うんですよね。
たくさんメモリ食ってるプロセスを突き止めようとタスクマネージャーを起動させようとするんですけど、そもそもタスクマネージャーが重いという。。。
であれば、PowerShellのワンライナーで取得しちゃいましょう。
0. 環境
- Windows 10 22H2
- PowerShell 7.3.2
1.プロセスの一覧取得
以下のコマンドで取得できます。
Get-Process
こんな結果になります。
2.プロセスごとにグルーピング
Get-Process
のままでは、親プロセスと子プロセス(表現合ってるのか?)が分かれているので、
わかりやすくするためにプロセス名ごとにグルーピングします。
Get-Process | Group-Object -Property ProcessName
こんな結果になります。
3.グループごとにメモリ使用量の合計を計算
Get-Process | Group-Object -Property ProcessName |Select-Object "Name", @{n="Memory"; e={($_.Group | Measure-Object "WS" -Sum).Sum}}
ちょっと長いですね。
グループからNameとWS(プロセスのワーキング セットのメモリサイズ)を取り出します。
Nameはグループのキーなので集計不要で
WSは グループから取り出しWSの合計を求め
($_.Group | Measure-Object "WS" -Sum).Sum
Memoryという名前を付けています。
こんな結果になります。
learn.microsoft.com learn.microsoft.com
4.使用量が多い順にソートする
先ほどのままではバラバラなのでソートします。
Get-Process | Group-Object -Property ProcessName |Select-Object "Name", @{n="Memory"; e={($_.Group | Measure-Object "WS" -Sum).Sum}} | Sort-Object "Memory" -Descending
こんな結果になります。
まとめ
これで、タスクマネージャーを立ち上げなくてもメモリ使用量が多いプロセスがわかりますね。
| Select-Object -First 5
をつけてあげれば Top5 だけを表示できます。
ちなみに、メモリ使用量の単位はバイトです。エンジニアな方々であれば、これで十分読めますよね? (えっ
嘘です。
必要であれば、 Select-Objetなどを使って単位変換を差し込んであげるとよいかと思います。