2013-04-04 14 views
23

私は、時には数時間にわたって非常に高いCPU使用率(ほぼ90%)を示すJavaアプリケーション(Webベース)を持っています。 Linux TOPコマンドがこれを示しています。アプリケーションの再起動時に、問題は解決しません。私が何をしているかのスレッドを見つけるためにスレッドダンプを取るJavaアプリケーションでCPU使用率が高い - なぜですか?

だから調査します。 'RUNNABLE'州にはいくつかのスレッドがあり、いくつかの州にはいくつかあります。繰り返しスレッドダンプを取ると、私は常に 'RUNNABLE'状態に存在するいくつかのスレッドを参照してください。だから、彼らは犯人のように見えます。

しかし、どのスレッドがCPUをホッギングしているのか、または無限ループに入っている(それによってCPUの使用率が高くなっている)のかはわかりません。

問題のコードは何も記録していない可能性があるので、ログは必ずしも役立つとは限りません。

どのように調査しますか - アプリケーションまたはスレッドのどの部分がCPU使用率を高めていますか? - 他のアイデア?

+0

すでにプロファイラを試してみましたか? – andreapier

+2

あなたのスレッドダンプは、これらのRunnableスレッドがスレッドダンプ中のコードのどこにあるかを示す必要があります。あなたはあなたのコード内を見る必要があります。 IIRCの「実行可能」スレッドはI/Oを待っていてCPUを占有していない可能性がありますが、それは早いですし、私はまだコーヒーを看護しています。 –

+0

andreapier> Prod環境ではプロファイラを使用できないかもしれませんが、ProfilerはどのスレッドがCPUを使用しているかを教えてくれますか? – Jasper

答えて

31

セットアップでプロファイラが適用されない場合は、this postの手順に従ってスレッドを識別してください。

は基本的には、そこに3つのステップです:

  1. 実行top -Hは、最高のCPUとスレッドのPIDを取得します。
  2. PIDを16進数に変換します。
  3. スレッドダンプで一致するHEX PIDを持つスレッドを探します。
+0

どのように私は窓で同じことを達成できますか? – dom

1

あなたの最初のアプローチは、Thread.sleepへのすべての参照を見つけて、それをチェックする必要があります:

  1. 睡眠を行うには正しいことです - 可能な場合は、待機メカニズムのいくつかの並べ替えを使用する必要があります - おそらく慎重な使用をBlockingQueueが役立つでしょう。

  2. 寝る場合でなければなりません。正しい時間に寝ていますか?これはしばしば非常に難しい質問です。

マルチスレッド設計の中で最も一般的な間違いが起こるために何かを待っているとき、すべてを行う必要がタイトループでしばらくして睡眠をチェックするためであると考えていることです。これはめったに効果的な解決策ではありません。その場合は常にwaitを試してください。

第2の最も一般的な問題は、睡眠なしでをループすることです。。これはさらに悪化し、追跡するのが少し難しくなります。

+0

'Thread.sleep'はCPUサイクルを消費しませんか? – skirsch

+1

@skirsch - それはありません - しかし、それは通常ブロックの代わりに使用され、ブロックが良いです。 – OldCurmudgeon

1

これらのピークCPU時間の間、ユーザーの負荷はどのようなものですか?あなたはこれがWebベースのアプリケーションだと言っているので、心に浮かぶのはメモリー使用の問題です。たとえば、セッションにたくさんのものを保存して、セッション数が十分に高くなると、アプリケーションサーバーはスラッシングを開始します。これは、使用しているスキームによってGCが問題を悪化させる場合もあります。このアプリとサーバーの設定についての詳細は、より多くのデバッグアイディアを指すのに役立ちます。

+0

メモリの使用状況が正常であるようです。 – Jasper

8

ガベージコレクションの問題が発生する可能性があります。

アプリケーションがメモリを必要とし、使用するように設定されている環境が低下している場合は、ガベージコレクタが頻繁に実行され、多くのCPUサイクルを消費します。 何かを集めることができない場合、あなたのメモリは低く留まるので、何度も何度も実行されます。 アプリケーションを再デプロイすると、メモリがクリアされ、ガベージコレクションが必要以上に実行されないため、CPU使用率が再び満杯になるまで低く抑えられます。

あなたはウェブフレームワークとして使用しているもの、また

What does Java option -Xmx stand for?を参照してください、-Xmxパラメータを確認してください)あなたのアプリケーションにはメモリリークの可能性がないことを確認し、それがうまくメモリ用に設定さだとする必要がありますか? JSFはセッションに多くの時間を費やし、多くのメモリを消費します。

+0

あなたは本質的にあなたが参照している世界のgcを停止することはできませんマルチスレッドを実行します。コアの1つを完全に使用することがわかります。 –

+0

メモリの使用状況は大丈夫と思われます。私はそれを見ています。 Java Visual VMから、GC(CPU)アクティビティがかなり低いことがわかります。 – Jasper

1

スレッドダンプには、以下のように行番号があります。現在実行されているメインスレッドの

...

"main" #1 prio=5 os_prio=0 tid=0x0000000002120800 nid=0x13f4 runnable [0x0000000001d9f000] 
    java.lang.Thread.State: **RUNNABLE** 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:313) 
    at com.rana.samples.**HighCPUUtilization.main(HighCPUUtilization.java:17)** 
関連する問題