✍️blog

技術系のこととか

PowerShellで各プロセスのメモリ使用量取得

エンジニアあるあるかもしれませんが、ブラウザのタブをめっちゃ開いていたり、いろんなツールを立ち上げっぱなしにしてたり

そんなことをしているとわりとメモリ食うんですよね。

たくさんメモリ食ってるプロセスを突き止めようとタスクマネージャーを起動させようとするんですけど、そもそもタスクマネージャーが重いという。。。

であれば、PowerShellワンライナーで取得しちゃいましょう。

0. 環境

1.プロセスの一覧取得

以下のコマンドで取得できます。

Get-Process

こんな結果になります。

learn.microsoft.com

2.プロセスごとにグルーピング

Get-Processのままでは、親プロセスと子プロセス(表現合ってるのか?)が分かれているので、 わかりやすくするためにプロセス名ごとにグルーピングします。

Get-Process | Group-Object -Property ProcessName

こんな結果になります。

learn.microsoft.com

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

こんな結果になります。

learn.microsoft.com

まとめ

これで、タスクマネージャーを立ち上げなくてもメモリ使用量が多いプロセスがわかりますね。

| Select-Object -First 5 をつけてあげれば Top5 だけを表示できます。

ちなみに、メモリ使用量の単位はバイトです。エンジニアな方々であれば、これで十分読めますよね? (えっ

via GIPHY

嘘です。
必要であれば、 Select-Objetなどを使って単位変換を差し込んであげるとよいかと思います。