何もしていないときに CPU を消費している Java アプリケーションがある場合、それが何をしているのかをどのように判断すればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

質問

ベンダーの Java API を呼び出していますが、一部のサーバーでは、API にログインした後 (CPU 使用率が 100% の場合)、JVM が低優先度のポーリング ループに入っているようです。他のサーバー上の同じアプリではこの動作は発生しません。これは WebSphere と Tomcat で発生します。環境のセットアップが難しいため、Eclipse 内でプロファイリングのようなことを実行しようとするのは困難です。

Tomcat で実行されている既存の Java アプリをプロファイリング (またはその他の検査方法) して、このようなスピン待機状態にあるときにどのメソッドが実行されているかを確認する方法はありますか?この状態になると、アプリは 1 つのメソッド (ベンダーのメソッド) のみを実行します。ベンダーはその動作を再現することはできません (もちろん)。


アップデート:

JConsole を使用すると、誰が実行しているのか、何をしているのかを確認できました。なぜそうなるのかを理解するまでに数時間かかりました。問題は、使用されていたベンダーの API jar が、使用されていたデータベース構成と正確に一致しないことでした。構成にわずかな不一致があるサーバーでは、デフォルトでトレースとパフォーマンスの監視が有効になっていました。別の瓶を使用しましたが、すべてうまくいきました。

ジョシュア、答えてくれてありがとう。JConsole は、既存のアプリケーションを監視するためにセットアップして使用するのが非常に簡単でした。

@Cringe - あなたが提案したオプションのいくつかを試してみました。JProfiler をセットアップする際にいくつか問題がありましたが、見た目は良さそうです (ただし高価です)。今後は、Eclipse Profiler プラグインを追加し、さまざまなオープン ソース プロファイラーを調べて機能を比較する予定です。

役に立ちましたか?

解決

Java 5 以降を使用している場合は、次を使用してアプリケーションに接続できます。 jコンソール 実行中のすべてのスレッドを表示します。jstack はスタック ダンプも実行します。これは Tomcat のようなコンテナ内でも機能すると思います。

これらのツールは両方とも JDK5 以降に含まれています (プロセスには少なくとも Java 5 が必要だと思いますが、間違っている可能性があります)。

アップデート:JDK 1.6 Update 7 以降、バンドルされたプロファイラーと呼ばれるプロファイラーが追加されたことにも注目してください。 VisualVM これは「jvisualvm」で起動できます。のようです java.netプロジェクト, 、そのページで追加情報が入手できる可能性があります。まだ使用していませんが、より本格的な分析には役立ちそうです。

お役に立てば幸いです

他のヒント

私が使用したのと同じ問題に直面している YourKit プロファイラー. 。実際に接続しない限り、ローダーはアクティブになりません (ただし、接続をリッスンするためにポートは開きます)。プロファイラー自体は、あまり目立たないモードで動作しながら、「各メソッドに費やされた時間を取得する」という優れた機能を備えています。

もう 1 つの方法は、最も優先度の高い「ウォッチドッグ」スレッドで CPU 負荷を (JNI 経由で、そのためには外部ライブラリが必要になります) 検出し、CPU の負荷が十分に高く、十分な時間が経過したときにすべてのスレッドのログを開始することです。見つかるかもしれません この記事 啓蒙的な。

専門的な目的で、お金に余裕がある場合は、ぜひ手に入れてみてください。 Jプロファイラー. 。単に洞察を得たいだけの場合は、以下を試してみてください。 Eclipse プロファイラー プラグイン. 。数回使用しましたが、現状は分かりません。

Eclipse プロジェクト自体からの新しい (?) プロジェクトも利用できます。 http://www.eclipse.org/tptp/ (見る この記事)。使ったことがないので、試す価値があるかどうかはわかりません。

オープンソース プロファイラーの非常に優れたリストも次の場所にあります。 http://www.manageability.org/blog/stuff/open-source-profilers-for-java

JRockit ミッション コントロール レイテンシー アナライザー。

JRockit に付属の Latency Analyzer は、JVM が何もしていないときに何を「実行」しているかを表示します。最新バージョンでは、次のレイテンシーを確認できます。

  • Java の待機/ブロック/スリープ/パーク。
  • ファイルI/O
  • ネットワークI/O
  • メモリ割り当て
  • GC が一時停止する
  • JVM レイテンシ (コード生成やクラス読み込みなど)
  • スレッドの停止

このツールは、レイテンシが発生したときのスタック トレースを提供します。レイテンシ データはさまざまな方法 (集約されたトレース、ヒストグラム、スレッド グラフなど) で表示できます。このツールを使用すると、スレッド間の遷移 (たとえば、あるスレッドが別のスレッドに通知する場合など) を確認することもできます。

レイテンシー アナライザー http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

オーバーヘッドは無視できるものであり、他の多くのツールとは異なり、実稼働環境で使用できます。これ ブログ投稿 簡単な紹介があり、プログラムをダウンロードできます ここ.

開発用途であれば無料でご利用いただけます!

JConsole が使用できない場合は、

  • プレス CTRL+壊す Windows下で
  • 送信 kill -3 <process id> Linux 上で

完全なスレッド ダンプを取得します。これはパフォーマンスには影響せず、実稼働環境でいつでも実行できます。

プロファイラーを使用します。 はい、お金がかかりますし、使用するのが少し面倒なこともありますが、推測ではなく、はるかに現実的な証拠を提供します。

人間は一般に、パフォーマンスのボトルネックがどこにあるのかを推測するのが苦手です。それは私たちの脳があまりうまく機能するように作られていないことのようです。明白に思えるかもしれませんし、問題が何であるかについて素晴らしいアイデアがあるかもしれませんが、現実の世界では何か違うことが判明することがよくあります。コードの間違った部分を最適化するということは、せいぜい、最小限の利益しか得られない多大な作業を意味します。多くの場合、それにより処理が遅くなり、場合によっては処理が完全に中断されてしまいます。したがって、最適化のために変更を加える前に、次のことを行う必要があります。 いつも プロファイラーやその他の正確なツールから本物の証拠を入手します。

前述したように、JProfiler と YourKit は両方ともかなり優れており、法外に高価ではありません。最後に見たときは、両方とも無料のデモもありました。

完全を期すために:私の会社は多かれ少なかれ Eclipse を標準としていますが、Netbeans (6 以降) を使用しています。 付属の無料プロファイラー 日常的に。これは Eclipse TPTP プラグイン (最後にチェックしたのは 3 か月前) よりもうまく機能し、JProfiler などの商用プロファイラーの必要性がなくなりました。JProfiler は優れていますが、急速に不要になりつつあります。

VisualVM は、スタンドアロンとして NetBeans のプロファイラーである必要があります。Eclipse の TPTP を試してみましたが、visualVm の方がはるかに優れたオプションのようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top