マルチスレッド Java アプリケーションが大量の CPU を消費している理由をデバッグしようとしているときに、各スレッドが CPU をまったく消費しない外部コマンドを実行することがわかりましたが、Java がそれを実行すると、Java ランタイムが CPU を 100% 使用していることがわかりました。
さらにデバッグするために、その外部プロセスを単純な Linux の「ls」コマンドに置き換えました。これが私がそれを実行している方法です-
String[] commands = new String[]{"/bin/sh", "-c", "ls"};
try {
Process p = Runtime.getRuntime().exec(commands);
} catch (IOException ex) {
//
}
それでも、Java がすべての CPU を使用していることがわかります。
プロセスからの出力を読み取ったり、ストリームを開いたりすることさえありません。
何が間違っている可能性がありますか?Java から外部で実行される単純なls
コマンドが、Java ランタイムに大きな CPU を消費させる原因となるのはなぜですか?
スレッド処理をシミュレートするために、外部コマンドを実行する代わりに、Thread.Sleep() を入れてみましたが、問題なく動作し、CPU を占有することはありません。