3

ある時点で CPU 使用率が 100% になり、同時にスリープ状態になる Java プログラムがあります。プログラムはマルチスレッドではありません。

周りを見回すと、その原因として最も可能性が高いのは、バグまたはガベージ コレクションに関して Java インタープリターを実行する方法の不一致であると思います。100% の CPU 使用率は GC によるものとしか考えられません。Xmx を使用してプログラムを実行するのに十分なメモリを割り当てていますが、プログラムは割り当てた量に近くても実行されません。私が割り当てる量も、マシンで使用可能な合計メモリよりもはるかに少ないです。

私はこれを見つけました:

http://code.google.com/p/spymemcached/issues/detail?id=279

また、stackoverflow.com では次のような言及もありました。

CMS ガベージ コレクター - いつ実行されますか?

それでも、解決策を見つけることができませんでした。これは JVM のバグですか? もしそうなら、どうすれば修正できますか?

編集: ここに jstack 出力のペーストを追加しました: http://pastebin.com/Au0V9FCN

4

1 に答える 1

3

問題を再現し、CPU が飽和していることがわかったら、Java プロセスで JSTACK ダンプを実行し、OS ユーティリティを使用してプロセス CPU とそのスレッドの CPU ブレークダウンをキャプチャします (Linux では ps -L)。実際には、1 秒間隔のサンプリングを約 10 回または 20 回実行するスクリプトをセットアップする必要があります。

この後、Linux で実行している場合は、LWPid を JSTACK 出力と相互参照できます。LWPID を ps -L から 16 進数に変換するだけで、JSTACK の出力に進むことができます。

この時点で、アプリで CPU を消費しているものについて明確なアイデアが得られます。

GC が問題である場合、GC スレッドが CPU を占有していることがわかります。この時点で、JConsole はさらなる根本原因を特定するのに役立ちます。それ以外の場合は、CPU 消費の責任者が誰であるかが明確にわかり、それに応じて行動できます。

PS私の例はLinux上にあります。Linuxを実行していない場合は、プロセスCPUブレークダウンダンプを取得する方法をグーグルで検索できます。

あなたが見つけたことを私に知らせてください。

于 2013-09-22T05:42:33.870 に答える