javaアプリでCPU使用率が爆上がりする原因

このところ、仕事で久々にjavaアプリを作成していたのだが、
作成したアプリを動作させてみると、やたらCPU使用率が高くなっていることが判明。

どれくらい高いかというと、驚きの130%超え。流石にこれはちょっとおかしい。
しかも常時高いわけではなく、特定のモードに入った時のみ高いと来た。

当然、この状態のままというわけにはいかないので、取り急ぎ調査することに。
調査方法は色々あると思うが、今回はアプリの規模もそこまで大きくないため
地道な方法をとることにする。トライ&エラーである。

つまり、CPU使用率を常時表示させておき、怪しい処理をコメントアウトしたアプリを
立ち上げて使用率を確認、を繰り返したわけだ。まあ怪しい箇所なんて2、3箇所しか無かったし。
(CPU使用率を常時表示しておくには、端末でtopコマンド実行でOK)

そして判明した原因は、スレッド処理であった。

今回、一定時間ごとに処理を実行するため、スレッドを1つ作成していた。
スレッド内の処理はこんな感じで、ごく一般的なもの。

private long mTime = 1000;

public void run() {
    while(true) {
        // 繰り返したい処理
    
        Thread.sleep(mTime);
    }
}

ただ、今回は動作モードによってはこの処理が不要だったため、条件によって
処理を実行しないパターンを作っていた。これがまずかった。

private long mTime = 1000;

public void run() {
    while(true) {
        if(条件) {
            // 繰り返したい処理
    
            Thread.sleep(mTime);
        }
    }
}

上記の、条件が一致しない場合、処理が何もない無限ループとなるわけだが、
それがjavaアプリにはえらく負担となるらしく、CPU使用率が爆上がりするのである。
なので、こうしたほうが良い。

private long mTime = 1000;

public void run() {
    while(true) {
        if(条件) {
            // 繰り返したい処理
        }
        Thread.sleep(mTime);
    }
}

何の処理も無いほうが負荷がかかるというのも不思議な話だが、
まあsleep中はCPUが休められると考えれば納得、なのかも。

とりあえず、javaアプリ作成時は、処理なし無限ループに注意しよう。

以上