Appleは2024年3月7日にmacOS Sonomaの最新版となる「macOS Sonoma 14.4」をリリースしたが、Appleシリコン(M1/M2/M3)を搭載しているMac上でこのアップデートを適用した場合、Javaプログラムが予期せずクラッシュする問題が発生しているという。Java 8からJDK 22の早期アクセスビルドに至るまで、すべてのバージョンのJava実行環境がこの問題の影響を受ける。

Oracleは同3月15日(現地時間)に公式ブログ上でこの問題について説明し、Appleシリコン搭載機でJavaを使用するユーザーに対して、問題が解決するまでmacOS 14.4へのアップデートの延期を検討するよう呼びかけている。

  • Java users on macOS 14 running on Apple silicon systems should consider delaying the macOS 14.4 update

    Java users on macOS 14 running on Apple silicon systems should consider delaying the macOS 14.4 update

原因はOSシグナルの変更

Oracleの製品管理担当シニアディレクターを務めるAurelio Garcia-Ribeyro氏によれば、問題の原因は、アプリケーションが保護されたメモリ領域にアクセスしようとした際にmacOSカーネルが返すシグナルが予告なく変更されたことだという。

Java仮想マシンに搭載されたJIT(Just-In Time)コンパイラは、コンパイルおよび実行サイクルの一部で保護されたメモリ領域にアクセスすることがある。従来のバージョンのmacOSでは、保護されたメモリ領域へのアクセスに対してSIGBUSまたはSIGSEGVのシグナルを返答しており、プロセスはこのシグナルを処理することで実行を継続していた。Java仮想マシンでは、コードを動的に生成する際に、正確性とパフォーマンスの向上のためにこのメカニズムを利用している。

これに対してmacOS 14.4では、スレッドが書き込みモードで動作しているときに保護されたメモリ領域へのアクセスが試行されると、SIGKILLシグナルを送信するように変更されたという。プロセスはこのシグナルを処理できず、アプリケーションがクラッシュする。

Aurelio Garcia-Ribeyro氏は、この変更はmacOS 14.4の早期アクセスには存在せず、正式リリース後に初めて明らかになったため、問題の発生を防ぐのは不可能だったと説明している。

現在、Javaの開発および実行環境はOpenJDKプロジェクトによってオープンソースで開発されている。Oracleをはじめとする各ベンダーは、OpenJDKの成果物を独自にビルド、カスタマイズすることで、それぞれのプロダクトとして提供する。したがって、Oracleだけでなく他のベンダーが提供しているJava実行環境についても、すべてこの問題の影響を受けることになる。

Appleが、なぜこのような基本的なメカニズムの変更を早期アクセスリリースによる検証を経ずに実施したのかは不明である。

JetBrainsも注意喚起を発表

Oracleの発表を受けて、統合開発環境(IDE)のベンダーであるJetBrains社もユーザーに向けて注意喚起を行っている。IntelliJ IDEAをはじめとするJetBrains製のIDEはJava仮想マシン上で動作する。そのため、Appleシリコン搭載MacでmacOS 14.4へのアップデートを実施した場合には、IDEがクラッシュする可能性があるという。

JetBrainsでは、IDEの起動Javaランタイム(JBR: JetBrains Runtime)を変更することでクラッシュの頻度が下がることを期待できると伝えている。ただし、JBRの変更には組込みブラウザ(JCEF)関連の別の既知の問題が含まれている。また、JBRの変更はあくまでもクラッシュの頻度が下がることが期待されているだけであり、根本的な解決策にはなっていない点にも注意が必要である。