2024年1月21日日曜日

(PC) powerShellでメモリの状況を見る、メモリを解放する方法!!

今回の記事は、例によって私のつたない自作コマンドなのですが、powerShellで、PCのメモリの状況を確認する方法と、併せて、メモリを解放する方法です。

メモリを解放するためには、前回の記事で紹介したマイクロソフト公式ツール(現在非公開)のrktools.exeが必要である事をご了承下さい。


メモリの状況を見る「MEM」コマンド

powerShellでメモリの状況を見る「MEM」コマンドです。



#メインRAMのモニター
function MEM() {
    $all=(Get-CimInstance -Class Win32_OperatingSystem | %{($_.TotalVisibleMemorySize)});
    $free=(Get-CimInstance -Class Win32_OperatingSystem | %{($_.FreePhysicalMemory)});
    $use=$all-$free;

    $all=[Math]::Round(($all/[Math]::Pow(1024,2)),3,[MidpointRounding]::AwayFromZero);
    $free=[Math]::Round(($free/[Math]::Pow(1024,2)),3,[MidpointRounding]::AwayFromZero);
    $use=[Math]::Round(($use/[Math]::Pow(1024,2)),3,[MidpointRounding]::AwayFromZero);
    
    $OutputEncoding = [console]::OutputEncoding;
    Write-Host "---メインRAM ---";
    Write-Host "ALL (GB)= " ($all).ToString();
    Write-Host "FREE(GB)= " ($free).ToString();
    Write-Host "USED(GB)= " ($use).ToString();
}


これをROG FLOW Z13で実行すると以下のようになります。


↑タスクマネージャーやARMOURY CREATEを開かなくとも、「MEM」コマンドをpowerShell(管理者モード)でメモリの全体・残量・使用中が見られます。

ここからが本題で、で、見られたからなんなの?という先の話となります。

前の記事のrktools.exeをインストールし、例によって管理者モードでpowerShellを起動するのが前提で、「EMPTY」コマンドを入力すると、メモリが解放されます。

コマンドは以下です。



#メインRAMをクリーンアップ
function EMPTY() {
    CMD /C "empty *";
    #CLEAR-HOST;
    MEM;
}

↑上の方のMEMコマンドを呼び出して、解放後の状況を自動で通知してくれるようにしています。

いつもながら私の勝手な自作なので、内容は自由に変えてやって下さい。


連打が可能!!ここがMS PC Managerとの大きな違い!!

このEMPTYコマンドですが、連打が可能です。

ここがMS PC Managerとの大きな違いです。

もちろん、モグラ叩きという表現の通り、すぐにボコボコ復活してくるので、打つべし、打つべし!!です。

当初、8GB台の消費量があっという間に4GB台に下がったのがお分かりかと思います。


そんな、打つべし、打つべしって、手作業で何回もやってらんねぇ!!という時は、次に自動実行コマンド「AUTO-EMPTY」です。


定期的にEMPTYを実行できる「AUTO-EMPTY」コマンド。ミリ秒単位で実行間隔が選べるよ

EMPTYコマンドを自分で連打するのは、めんどくさすぎる!!という場合は、以下に自動実行のAUTO-EMPTYをご用意しております。

これはパラメーターが必要で、たとえば1秒間隔であれば「AUTO-EMPTY 1000」とします。

ただ、あんまり頻繁に動かすと、CPUによっては、Excelなどのアプリの実行速度を遅くしてしまう可能性もあるので、10秒間隔がおすすめ。

「AUTO-EMPTY 10000」で10秒間隔となります。



#自動メモリ解放
function AUTO-EMPTY($waitTime) {
    $CNT = 0;
    while ($true) {
        EMPTY;
        $CNT++;
        WRITE-OUTPUT ("メインRAMを自動開放中 [ "+(([float]$waitTime/1000).ToString("0.0000"))+" ] 秒間隔");
        WRITE-OUTPUT ("開放回数 [ " + ($CNT) + " ] 回")  
        START-SLEEP -M $waitTime;
    }

}

↑ROG FLOW Z13で実行しています。

10秒間隔だと、その間にメモリ使用量が復活して来て、前よりも使用量が多くなったりしてますが。

後ろでこの処理を実行していると、たとえメインRAMを8GBしか搭載してないPCでも、開発用にSQL-Serverをまともに運用できたりします。

SQL-Serverはメモリがなくなるとどうなるか、たとえ一行のSELECT文、一項目のCREATE TABLEでも、結果が数分間も帰って来なくなったりします。

まぁ、マイクロソフト非公開ツールがバックの自作コマンドなので、使って欲しいとはとても言えませんが、このようにして工夫してやってますというエピソードとして捉えてもらえれば幸いです。