jvisualvm を使用してアプリケーションのプロファイリングを行ったところ、Object.wait() で多くの時間を費やしていることがわかりました。
このメソッドが呼び出されるオブジェクトを見つけるにはどうすればよいですか?
jvisualvm を使用してアプリケーションのプロファイリングを行ったところ、Object.wait() で多くの時間を費やしていることがわかりました。
このメソッドが呼び出されるオブジェクトを見つけるにはどうすればよいですか?
jvisualvm に制限されていない場合は、JProfilerで、ロック グラフ内のオブジェクトを右クリックして、ヒープ ウォーカーで調べることができます。
これは現在のロック状況に関するものですが、履歴ビューでは以前のロック状況にアクセスできます。また、モニターをクラス別に分類するモニター統計ビューもあります。
免責事項: 私の会社は JProfiler を開発しています。
実際、Java SE SDK には便利なクラスThreadInfoが付属しており、これを調べて、スレッドがブロックされている理由と、待機ポイントまでの完全なスタックトレース、および待機に費やされたミリ秒単位の合計時間を含めて、スレッドが待機しているものを知ることができます。
java.lang.management
パッケージを介してこのクラスを使用します。具体的ManagementFactory.getThreadMXBean()
には、このクラスを使用して、ブロックされたスレッドをプログラムで検査できます。
JConsole からの関連するスクリーンショットを次に示します。
保留Object.wait()
は完全に合法で安全な状況です。たとえば、スレッドがBlockingQueue
. この待機に費やされた時間は、デッドロックでない限り、アプリケーションのパフォーマンスに影響を与えるべきではありません。