2025/11/28 11:19 Help, My Java Object Vanished (and the GC Is Not at Fault)

ロボ子、大変なのじゃ!OpenJDKでJavaオブジェクトが消える事件が発生したらしいぞ!

それは大変ですね、博士。一体何が原因だったんでしょうか?

どうやら、HotSpotの新しい機能をテスト中に、オブジェクトヘッダーのサイズを削減するCompact Object Headersが原因だったみたいじゃ。

オブジェクトヘッダーですか。mark wordとclass wordで構成されている部分ですね。

そうそう!JDK 24で導入されたCompact Object Headersは、class wordをmark wordに組み込むことでサイズを削減するらしいのじゃ。でも、これがバグを引き起こしたみたい。

具体的には、どのような問題が起きたんですか?

75件ものテストが失敗したらしいぞ!`java.lang.AssertionError`や`java.lang.NoClassDefFoundError`が発生したみたいじゃ。

`NoClassDefFoundError`ですか。クラスが見つからないとは、一体何が...

それが謎なのじゃ!テストごとに見つからないクラスが異なったり、同じテストでも実行ごとに異なったりするらしい。

まるで、オブジェクトが文字通り消えてしまったかのようですね。

まさに!原因を突き止めるために、開発者たちはC2コンパイラを使用したり、Compact Object Headersを無効にしたりして、バグの再現を試みたらしいぞ。

地道な作業ですね。最終的に原因は特定できたんですか?

`Object::hashCode`が原因だったみたいじゃ!`UseObjectMonitorTable`が無効の場合、ビットマスクがネイティブポインタのビットを誤ってチェックし、必要なスローパスが実行されないことが判明したらしい。

`Object::hashCode`ですか。基本的なメソッドが、そんな複雑な問題を引き起こすとは驚きです。

ほんとじゃな!64ビットのネイティブメモリーポインタが16バイトアラインメントされていたから、以前はバグが発生しなかったみたいじゃ。今回はたまたま条件が重なって顕在化したみたいだぞ。

なるほど。教訓として、強力な方法論を持ち、仮定に挑戦し、適切なタイミングで適切な質問をすることが大切だと。

その通り!そして、デバッグツールを使いこなすことも重要じゃな。今回の件で、JVMの内部動作やデバッグの奥深さを改めて感じたぞ。

今回の騒動は、Project Valhallaにも影響があったようですね。

そうじゃな。ValhallaビットのレイアウトがJEP 450とは異なる形式で選択されたことが、今回の問題に繋がった一因とも言えるじゃろう。

今後の開発では、このような問題が再発しないように、より慎重なテストが必要ですね。

まったくだぞ!しかし、オブジェクトが消えるなんて、まるで手品みたいじゃな!

博士、それは少し不謹慎ですよ。でも、今回のバグの原因が`hashCode`だったとは、まさに「ハッシュ」な出来事でしたね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
