3

jvisualvm を使用してアプリケーションのプロファイリングを行ったところ、Object.wait() で多くの時間を費やしていることがわかりました。

このメソッドが呼び出されるオブジェクトを見つけるにはどうすればよいですか?

4

3 に答える 3

1

jvisualvm に制限されていない場合は、JProfilerで、ロック グラフ内のオブジェクトを右クリックして、ヒープ ウォーカーで調べることができます。

ここに画像の説明を入力

これは現在のロック状況に関するものですが、履歴ビューでは以前のロック状況にアクセスできます。また、モニターをクラス別に分類するモニター統計ビューもあります。

ここに画像の説明を入力

免責事項: 私の会社は JProfiler を開発しています。

于 2012-09-10T10:26:11.500 に答える
1

実際、Java SE SDK には便利なクラスThreadInfoが付属しており、これを調べて、スレッドがブロックされている理由と、待機ポイントまでの完全なスタックトレース、および待機に費やされたミリ秒単位の合計時間を含めて、スレッドが待機しているものを知ることができます。

java.lang.managementパッケージを介してこのクラスを使用します。具体的ManagementFactory.getThreadMXBean()には、このクラスを使用して、ブロックされたスレッドをプログラムで検査できます。

JConsole からの関連するスクリーンショットを次に示します。

ここに画像の説明を入力

于 2012-09-09T12:26:01.480 に答える
0

保留Object.wait()は完全に合法で安全な状況です。たとえば、スレッドがBlockingQueue. この待機に費やされた時間は、デッドロックでない限り、アプリケーションのパフォーマンスに影響を与えるべきではありません。

于 2012-09-09T12:22:54.120 に答える