25

Java Thread を深く理解するための道を歩み続けています。残念ながら、私の Java 認定資格はその部分をカバーしていませんでした。そのため、学習する唯一の方法は、一連のばかげた質問を投稿することです。Java 開発に何年も携わってきたので、私はまだどれだけのことを学ばなければならないのだろうかと思うことがあります :-)

特に、参照ハンドラ スレッドに注目しています。

"Reference Handler" daemon prio=10 tid=0x02da3400 nid=0xb98 in Object.wait() [0x0302f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1aac0320> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
    - locked <0x1aac0320> (a java.lang.ref.Reference$Lock)

いくつかの質問は次のとおりです。そのうちのいくつかについては答えを知っていますが、他の人の意見を聞きたいので投稿しません。

  1. リファレンス ハンドラ スレッドは何をすべきか?
  2. スレッド ダンプはボトムアップと見なす必要があります。スタック トレースがロックされた状態で始まるのはなぜですか。少なくともスレッドが実行された後にロック ステートメントが表示されるべきではありません。
  3. 「ネイティブメソッド」とは?
  4. スレッド ダンプがソース コードをリコールできない場合、「不明なソース」はなぜですか?
  5. 最後に、待機とロックは同じですが、なぜですか?

いつものように、すべての質問にお答えいただき、回答済みとしてマークできるようお願いいたします。

4

3 に答える 3

14
  1. JVM の実行中のファイナライザーを処理していると思われます。これは実装の詳細であり、JVM 仕様では指定されていません。
  2. これは、がそのjava.lang.ref.Reference$Lockの行(つまり.ReferenceHandler.run()
  3. 「ネイティブ メソッド」とは、メソッドがネイティブ (つまり、Java 以外の) コードで実装されていることを意味します (JNI を考えてください)。
  4. 不明なソースは、.classファイルにソース コードの場所情報が含まれていないことを意味します (少なくともこの特定のポイントについて)。これは、メソッドが合成メソッドである場合 (ここでは似ていません)、またはクラスがデバッグ情報なしでコンパイルされた場合に発生する可能性があります。
  5. スレッドが何らかのオブジェクトを待機している場合、呼び出しトレースのある時点でそのオブジェクトをロックしている必要があるため、対応するがなければ を実際に持つことはできません。waiting onlocked
于 2011-10-05T08:47:37.330 に答える
4

1) ファイナライザー スレッドは、ファイナライザー メソッドを呼び出します。参照スレッドにも同様の目的があります。

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/ref/Reference.java.htm

OpenJDKソースは、それが

保留中の参照をエンキューする優先度の高いスレッド

GC は、処理が必要な参照の単純なリンク リストを作成し、このスレッドはそれらを適切なキューにすばやく追加します。これが 2 つのフェーズで行われる理由は、GC が参照を見つけることだけを行うためです。このスレッドは、これらの参照を処理するコード (Call Cleaners など) を呼び出し、ReferenceQueue リスナーに通知します。

2) 同期されたメソッドが入力される前にロックが取得されます。

3-5) ヨアヒムがカバー ;)

于 2011-10-05T10:29:32.527 に答える
2

うわー、私には深すぎる。私はあなたの質問の 1 つまたは 2 つしか答えられません。

「ネイティブ メソッド」とは、単にそのメソッドの実装がネイティブ (つまり、C または C++) ライブラリにあることを意味します。コール スタックが「ネイティブになる」と、JVM はそれを監視できなくなります。追加のスタック情報を提供する方法はありません。

「不明なソース」は、コードが最適化をオンにしてデバッグ情報をオフにしてコンパイルされたことを意味する可能性があります (-gフラグ?)。これにより、.class ファイルからファイル/行情報が削除されます。

于 2011-10-05T08:46:14.960 に答える