このところ、仕事で久々に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アプリ作成時は、処理なし無限ループに注意しよう。
以上