Java JVMプロファイリング、スレッドステータス-「監視」ステータスとはどういう意味ですか?


81

ここに画像の説明を入力してください

私はvisualVMを使用してマルチスレッドJavaアプリケーションに接続します。スレッドには、実行中、スリープ中、待機中、監視の4つのステータスがあります。この監視ステータスはどういう意味ですか?待機と監視の違いは何ですか?

回答:


89

これらの状態は、Thread.State列挙型で言及されているものと同じです。「待機」とは、ドキュメントに記載されているとおり、次のことを意味します。

次のいずれかのメソッドを呼び出したため、スレッドは待機状態になっています。

  • タイムアウトなしのObject.wait
  • タイムアウトなしのThread.join
  • LockSupport.park

「モニター」は、BLOCKEDスレッドがオブジェクトのロックを取得するのを待機している状態です(synchronized別のスレッドがすでに関連付けられたロックを保持しているときに、ブロックまたはメソッドに入ろうとしているため)。


24
「モニター」がこことドキュメントで「ロック」の同義語として使用されていることを知っておくと、この主題に不慣れな人(OPなど)が役立つ場合があります。
マットb

6
とにかく、どの同期オブジェクト(またはコード行)がスレッドをブロック/監視させているのかを知ることはできますか?
user123321 2012

3
@ user123321スレッドダンプを作成できます。([スレッド]タブの右上隅にあるボタン。)ここで、スレッドが同期しようとしているものと、ロックを保持しているスレッドを確認できます。
フィルダー2013

そして、スクリーンショットに表示されているsleepingとの違いは何waitingですか?!
ムハンマドゲルバナ

7

これは「監視」ステータスではありません...スレッドが状態にあることを示しますThread.State.BLOCKED。別の良い答えがあると思います。より深い説明のためにこのリンクを紹介します


5

モニターは、スレッドがオブジェクトのロックを取得するのを待機していることを意味します。たとえば、あるスレッドが同期されたメソッドを実行していて、別のスレッドが同じオブジェクトでそれを呼び出そうとすると、メソッドの最初の呼び出しが終了するまで、そのスレッドは実行できません。これは、最初のスレッドがそのオブジェクトにモニターまたはロックを持っているため、2番目のスレッドは解放されるまで待機する必要があるためです。

OracleThreadingチュートリアルから

「同期は、組み込みロックまたはモニターロックと呼ばれる内部エンティティを中心に構築されます。(API仕様では、このエンティティを単に「モニター」と呼ぶことがよくあります。)組み込みロックは、同期の両方の側面で役割を果たします。オブジェクトの状態と確立は、可視性に不可欠な関係の前に起こります。」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.