Java プログラムで jvmti エージェントを実行すると、jvm でデッドロックが発生したようです。私の jvmti エージェントでは、Agent_OnLoad() で 1 つの raw モニターを作成し、すべてのコールバック関数の最初でそのロックに入り、すべてのコールバック関数の終わりでそのロックを終了します。このデッドロックの理由はわかりません。jvmti エージェントでデッドロックが発生する可能性は他にありますか?
ありがとう。
はい、JVMTI エージェントでデッドロックが発生する可能性があります。JVMTI リファレンスには次のように記載されています。
同じスレッドが複数回モニターに入る場合があります。スレッドは、モニターに入った回数だけモニターから出なければなりません。OnLoad 中に (アタッチされたスレッドが存在する前に) モニターに入り、アタッチされたスレッドが存在するようになったときに終了していない場合、メイン スレッドで開始されたと見なされます。
この場合、リモートで診断を行うのは難しい場合がありますが、デモ JVMTI アプリケーションが生ロックの使用をどのように処理するかを確認することをお勧めします。専用の機能enter_critical_section
と を使用しexist_critical_section
ます。それが役立つかもしれませんが、それ以外の場合は、エージェントをデバッグしてデッドロックを引き起こすコールバックを見つけてください。