萌えハッカーニュースリーダー

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

出典: https://arraying.de/posts/markword/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それは少し不謹慎ですよ。でも、今回のバグの原因が`hashCode`だったとは、まさに「ハッシュ」な出来事でしたね。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search