4

Javaスレッドは、常に次の10の状態のいずれかになります。

NEW: Just starting up, i.e., in process of being initialized.
NEW_TRANS: Corresponding transition state (not used, included for completness).
IN_NATIVE: Running in native code.
IN_NATIVE_TRANS: Corresponding transition state.
IN_VM: Running in VM.
IN_VM_TRANS: Corresponding transition state.
IN_JAVA: Running in Java or in stub code.
IN_JAVA_TRANS: Corresponding transition state (not used, included for completness).
BLOCKED: Blocked in vm.
BLOCKED_TRANS: Corresponding transition state.

未使用の状態(UNINITIALIZED)はリストから省略されています。

状態の定義は上に示されていますが、実行中のappserverの特定のスレッド状態設定を解釈するための「経験則」を探しています。そして、より具体的には:

さまざまな時点で、次のスレッド統計( jstackを使用して取得)を持つライブアプリケーションサーバーを想定します。

  • 100スレッド:BLOCKED35、65IN_NATIVE
  • 113スレッド:BLOCKED35、77、1IN_NATIVEIN_VM
  • 52スレッド:BLOCKED38、1、6、7IN_JAVAIN_NATIVEIN_VM
  • 120スレッド:BLOCKED39、1、80IN_JAVAIN_NATIVE
  • 94スレッド:BLOCKED34、59、1IN_NATIVEIN_NATIVE_TRANS

5つの統計のスレッドごとに、JVMの全体的な状態に関して何を推測できますか?つまり、「このシナリオでは、JVMは要求を待機しているように見えます」、「マシンは要求の処理でビジーです」などです。

4

3 に答える 3

4

このレベルの出力では、そのようなステートメントを作成するのに十分な情報が提供されません。

例として、BLOCKED状態を考えてみましょう。スレッドがブロックされる原因となる可能性のあるものはたくさんあります。それらのうちの2つは、クライアントからデータが返されるのを待っており、データベースからデータが返されるのを待っています。前者の場合、アプリケーションはアイドル状態であり、後者の場合、アプリケーションは過負荷になっています。

編集:jstackからの出力を見ていなかったので、これら2つの条件もIN_NATIVEとして表すことができると思います。ただし、同じコメントが当てはまります。彼らが何をしているのかわからないため、アプリケーション全体についてステートメントを作成することはできません。

于 2009-12-01T17:18:50.723 に答える
1

kdgregoryは正しいので、スレッドの状態は必ずしもそれ自体で必要なものを明らかにするわけではありません。ただし、jstackはスタックトレースも提供し、プログラム内のスレッドがどこにあるかを正確に確認できるようにする必要があります(難読化されていないなどの場合)。たとえば、トレースにInputStream.read()の呼び出しが含まれているBLOCKEDスレッドは、かなり明白なはずです。

于 2009-12-01T18:11:14.477 に答える
1

スレッドの状態を調べたり、実際にデータをプロファイリングしたりするときに一般的に興味深いのは、「これが当てはまると思っていたのか」と自問できることです。取得しているデータが悪い/良い/期待されている/予期されていないかどうかについて意見がない場合、それについて多くのことを行うのは困難です。

スレッドの状態では、個々のスレッドの動作を調べて、「そのスレッドがその状態にあること、またはそのロックを非常に長い間待っていることを期待していましたか?」と自問する方が興味深いと思います。そして、特定のスレッドがブロックされている/待機していることなどを知ること自体は、それがブロックされている/待機しているものを知ることほど興味深いものではありません。

于 2009-12-01T19:02:06.547 に答える