sun.misc.Unsafeへの対応に関する議論がコミュニティで始まっている。このクラスは,サポート対象外のプロプライエタリなAPIの一部であるにも関わらず,メモリ管理の低レベルアクセスを提供する手段として,数多くの一般的なツールが広く利用している。Oracleが,ある時点でこのクラスを削除したいという意向を示したことで,開発者たちは,有効な代替手段を模索している状況だ。
Java 6のリリース以降のjavaコンパイラは,プロプライエタリAPI内のクラスの利用に対して,警告を行うように変更されている。プロプライエタリAPIクラスはOpenJDKの定義には含まれていない。つまりこれらのクラスは,事前の警告なく変更ないし削除される可能性がある,ということだ。さらにJava TCKの対象からも外れているため,すべてのJVM実装で利用可能であるという保証はなく,利用可能であっても動作が同じだとは限らない。要するに,これらクラスの利用は完全に非推奨なのだ。
Application.java:37: 警告: Unsafeは内部所有のAPIであり、今後のリリースで削除される可能性があります
sun.misc.Unsafeで問題となるのは,その提供する機能の多くが,OpenJDKで提供されている標準クラスでは利用できないことだ。このためにライブラリの作者たちは,アトミックなメモリ操作やネイティブコードとの高速なインタラクション,あるいはヒープ外のメモリアクセスなどを実現するために,警告を無視してこのクラスを利用し続けてきた。SpringやMockito,java.util.concurrentライブラリなどは,Unsafeを使用しているために,この変更によって影響を受けるツールの一例だ。そのように考えると,これらのツールやライブラリのいずれかを使用しているJavaアプリケーション(大半のアプリケーションがそうであることは間違いない)は,間接的な影響を受けることになる。
現在の議論の状況を見ると,本記事の執筆時点ではまだ流動的ではあるものの,短期的および長期的の両方の選択肢が含まれているようだ。
長期的には変数ハンドル(Variable Handle)が,オブジェクトフィールドと配列要素に関するsun.misc.Unsafeのオペレーションの代替手段としてサポートされることになる。これは,変数ハンドルはUnsafeの完全な置き換えではないが,いくつかのユースケースに対しては十分に機能するという意味だ。変数ハンドルは現在JEP 193として開発中で,Java 9での公開が予定されている。しかしながらコミュニティメンバの中には,Java 9のFeature Completeの期限(2015年12月)に本当に間に合うのか,懸念する声もある。完全な実装が予定通り公開されたとしても,次のバージョンのJavaがリリースされるまでは,ライブラリをUnsafeからVarHandlesに移植することはできない(Java 9の開発バージョンで作業に着手することも可能だが,すべての人たちが望む方法ではないはずだ)ので,ここで短期的なソリューションの必要性が生じる。
短期的にOracleが計画しているのは,Unsafeを削除するのではなく,Java 9で新たに利用可能になるモジュールシステムを使って隠蔽するが,クラスへのアクセスはこれまで通り可能にする,という方法である。実際に使用するメカニズムについては,現在まだ議論中だ。例えば,現在提案されている方法のひとつは,コマンド行で特定のフラグを渡して,Unsafeを含むプロプライエタリAPIにアクセス可能にする,というものだ。この方法であれば,独自の起動スクリプトを提供しているツールでは,そのフラグをサポートするようにスクリプトを変更することによって対応可能で,エンドユーザは変更を意識する必要はない。しかし,アプリケーションを自分自身で起動する開発者向けのツールによるソリューションでは,影響を回避することはできないはずだ。
今回の提案による潜在的な影響と,想定されるソリューションに関する不確実性が,コミュニティの中に激しい議論を巻き起こしている。重要な変更に対するリアクションとして,これは珍しいものではない。例をあげれば,G1をデフォルトのガベージコレクションにするというOracleの提案にも,同じような議論があった。この時は,Oracleが妥協案を受け入れて,G1のパフォーマンスが満足のいくものでなかった場合に変更を元に戻す,バックアッププランを加えることになった。
訂正:2015年8月2日
この記事に当初あった,sun.misc.Unsafeに関するイニシアティブがOracleによって主導されている,および変数ハンドルがUnsafeの完全な代替手段である,という説明は誤りである。実際には,イニシアティブはコミュニティメンバによって主導されており,また,変数ハンドルはUnsafeの機能の一部を代用するものである。