Java 21 仮想スレッド - ひとつのロックはどこにあるの?
Netflixは、Javaの広範囲な使用で知られており、仮想スレッドのパフォーマンス上の利点に熱心でした。 しかし、Java 21に移行する過程で、SpringBoot 3と組み込みTomcatを使用するアプリケーションで仮想スレッドを使用する際、断続的なタイムアウトと応答しないインスタンスが発生しました。 調査で、closeWait状態のソケットが増加し、アプリケーションが接続を閉じることに失敗していることが明らかになりました。 スレッドダンプは、最初はアイドル状態のJVMを示しましたが、特定のコマンドを使用したさらなる分析で、多くの「白紙」仮想スレッドが存在することがわかりました。これは、仮想スレッドの実行に関する問題を示し、Tomcatが各入力リクエストに対して新しい仮想スレッドを作成し、基礎となるオペレーティングシステムスレッドがすべて占有されていることを示しました。 スレッドダンプのより深い分析で、オペレーティングシステムスレッドが、コード内の同期ブロックでロックを待ち合わせている仮想スレッドにピン留められていることがわかりました。 これが、レギュラープラットフォームスレッドがウェイト操作を完了した後、ロックを再取得できなかったデッドロック状況を引き起こし、観察されたパフォーマンス問題を生じさせました。