16

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

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


アップデート:

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

ジョシュア、あなたの答えに感謝します。JConsoleは、セットアップと既存のアプリケーションの監視に非常に簡単に使用できました。

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

4

8 に答える 8

18

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

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

更新:JDK 1.6 update 7以降、「jvisualvm」で起動できるVisualVMと呼ばれるバンドルされたプロファイラーがあることにも注意してください。java.netプロジェクトのように見えるので、そのページで追加情報を入手できる場合があります。私はまだこれを使用していませんが、より深刻な分析に役立つようです。

お役に立てば幸い

于 2008-08-16T02:12:04.090 に答える
7

Facing the same problem I used YourKit profiler. It's loader doesn't activate unless you actually connect to it (though it does open a port to listen for connections). The profiler itself has a nice "get amount of time spent in each method" while working in it's less obtrusive mode.

Another way is to detect CPU load (via JNI, so you'd need an external library for this) in a "watchdog" thread with highest priority and start logging all threads when the CPU is high enough for a long enough time. You might find this article enlightining.

于 2008-08-16T18:26:17.587 に答える
3

それが専門的な目的であり、使うお金がある場合は、JProfilerを手に入れてみてください。洞察を得たいだけの場合は、EclipseProfilerPluginを試してみてください。何度か使ってみましたが、現状がわかりません。

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

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

于 2008-08-16T05:40:53.403 に答える
3

JConsole を使用できない場合は、使用できます

  • Windows ではCTRL+を押しますBREAK
  • kill -3 <process id>Linuxで送信

完全なスレッド ダンプを取得します。これはパフォーマンスに影響を与えず、常に本番環境で実行できます。

于 2008-08-23T08:22:58.703 に答える
2

JRockit Mission Control レイテンシ アナライザ。

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

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

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

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

オーバーヘッドはごくわずかで、他の多くのツールとは異なり、運用環境で使用できます。このブログ投稿では簡単な紹介を行い、プログラムはここからダウンロードできます。

無料で開発に使えます!

于 2008-09-29T21:00:24.403 に答える
1

プロファイラーを使用します。はい、お金がかかりますし、それらを使用するのは少し面倒な場合もありますが、当て推量ではなく、より多くのより現実的な証拠を提供します.

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

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

于 2008-08-21T12:49:59.327 に答える
0

完全を期すために、私の会社は多かれ少なかれ Eclipse で標準化していますが、Netbeans (6 以上) とそれに含まれる無料のプロファイラーを日常的に使用しています。Eclipse TPTP プラグイン (最後にチェックしたのは 3 か月前) よりもうまく機能し、私たちにとっては JProfiler などの商用プロファイラーが不要になります。これは優れていますが、すぐに不要になります。

于 2008-08-19T18:50:40.873 に答える
0

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

于 2008-08-21T11:51:46.923 に答える