7杯目のおかわりコーヒーはイルカの夢を見るか?

この投稿は Java Advent Calendar 2012 の12月2日担当分として新たに書き下ろしたものです。前日分は @skrb さんの「Project Lambda の遅延評価」です。


昨年の Java Advent Calendar 2011 - 27日目で「Mustangへの鎮魂歌」と題してJava SE 6の辿った軌跡を物語風に書き、次の言葉で締めています。

筆者は、もし来年同じような執筆の機会が得られたとしたならば、Java SE 7について思うところを書き留めたいと考えています。そしてその時、今回Java SE 6へ贈った賛辞を、そのままJava SE 7に贈ることができることを、切に望んでいます。

現状を見る限りでは、昨年Java SE 6に贈ったような賛辞をJava SE 7とJava SE 8に贈る気にはとてもなれません。Java SE 7がかつて「Dolphin」と呼ばれていた頃の機能が出揃うのは、最速でもJava SE 9になる見込みだからです。また筆者の印象では、Java SE 7/8はマイナーリリースと見間違うくらいの地味なバージョンアップで、先進的な機能ではライバルのC#.NETに大きく水を開けられています。

では、Java SE 7はダメダメな製品なのでしょうか?確かに目新しさはなく、メジャーアップデートとしては力不足は否めませんが、Java SE 6が長年かけて築いたものを守り抜くだけのポテンシャルを有しています。その中で筆者が目を付けたのがHotSpot VMの機能強化(表1)です。

表1 JDKにバンドルされているHotSpot
JDKHotSpotRemarks
Java SE 6 JDK6 Update 1 HotSpot 10.0  
JDK6 Update 10 HotSpot 11.0 Consumer JRE
JDK6 Update 14 HotSpot 14.0 G1GC
JDK6 Update 18 HotSpot 16.0
JDK6 Update 21 HotSpot 17.0
JDK6 Update 23 HotSpot 19.0
JDK6 Update 25 HotSpot 20.0
Java SE 7 JDK7 GA HotSpot 21.0 InvokeDynamic 
JDK7 Update 2 HotSpot 22.0 JavaFX 2.0
JDK7 Update 4 HotSpot 23.0 JRockit integration
(JMX, jcmd, Flight Recorder)
JDK7 Update 12 HotSpot 24.0
Java SE 8 JDK8 HotSpot 25.0 Remove PermGen

HotSpotに独立したバージョンが付けられるようになったのはJDK6 Update 1からですが、java -version で確認できるのはJDK6 Update 10からです(JDK6 Update 7以前はリリースノートからリンクされているバグレポートから確認できます)。JDK6はUpdate 14からUpdate 23にかけてOpenJDK7から絶えず新機能のバックポートがあり、そのためHotSpotのバージョンが急激に上がっています。一方でJava SE 7リリース以降、HotSpot 20.xでのバグフィックスが中心で、新機能のバックポートはほぼ行われていません。

JDK6のHotSpotは約6年かけてゆっくりと進化を遂げてきました。対してJDK7はGAから約1年でHotSpotのメジャーバージョンが3も上がっています。これはJDK6よりも速いペースです。その詳細を少し覗いてみましょう。

HotSpot 21.0 (JDK7 GA~Update 1)

  • InvokeDynamicの導入に伴うJVM拡張。それに伴い「Java仮想マシン仕様 第2版」に修正あり。
  • [補足] JDK6でバンドルされていたJava DBは、JDK7の一部として組み込み。

HotSpot 22.0 (JDK7 Update 2~Update 3)

  • JavaFX 2.x対応。
  • [補足] 同時期のJava SE 7のインストーラは、JDK7インストール後にJavaFXのインストーラを別途起動する仕組み

HotSpot 23.0 (JDK7 Update 4~)

  • JRockitとの統合計画「Project HotRockit」の第一段階。
  • JRockitのツール群の一部を移植:
    • JMXの改良 → JRockit互換の実装に変更、JRockit Mission Control等で関し可能に。
    • jrcmd → jcmdとして取り込み(全機能が移植されたわけではない)。ただしサブコマンド名はすべて変更。
    • JRockit Flight Recorder → Java Flight Recorderと改称してHotSpotおよびjcmdが対応。試験的実装であるがそれなりの出力を返す。ただし、JRockit Mission Controlでのリアルタイム分析は不可能(オフラインは可、Mission Control側の問題と推測)。
  • G1GCの正式サポート(当初はGAでの対応を予定)
  • Mac OS Xのサポート - JDK & JavaFX

※HotSpot 23については、筆者がWebLogic Serverで受け持ったセッションの前半部分で触れています。その時の発表資料を再掲します。

2012-12-03 注:
失念していましたが、過去の投稿がありました→「JDK7u4の新機能について

※Update 6以降、以下の小さな変更あり:

  • HotSpot 23.xを継続採用。
  • JavaFXのLinuxサポート。
  • JavaFXとの統合 - JavaFXのランタイムがrt.jarと同じディレクトリ階層に移動、JDKをインストールすると既にJavaFX 2.2が入っている。

HotSpot 24 (JDK7 Update 12~)
※開発開始直後のため現時点では情報はほとんどないが、以下の機能強化が予想される。

  • Java Flight Recorder対応の強化? - HotSpotがどんなに頑張ってもMission Controlの対応が遅ければ意味がないような...
  • Deterministic GCの導入? - OpenJDKでは話題にさえ上がらない。類似するG1GCに絞るつもりなのか、それともOracle側で開発するのか...情報求む!
  • JDK7のサポート終了まで、VM関連の修正はHotSpot 24.xで行う。これはJDK8 GAのJVMがHotSpot 25でほぼ固まったためと考えられる。

なお、JDK8ではHotSpot 25の採用が予定されています。このバージョンでは、長年の懸案であったパーマネント領域の廃止を含む変更が行われます。

Jigsaw導入がJava SE 9に延期され、Java EE 7のPaaS対応も見送られるなど、言語としてのJavaは停滞期に入ったとも言えます。しかし、実行環境としてのJavaは、特にHotSpotに関しては着実に進化しています。Twitter社がCRubyを捨ててJVMを採用したのは、ある意味先見の明があったのかも知れません。

JavaのAPIは、JDK6のレベルでほぼ成熟し、JDK7では細かい使い勝手の向上に重点が置かれています。しかし、それを支えるJVMとツールは大きく進化しました。同梱のVisualVMやjcmdは使い勝手が良く、旧来の管理・監視コマンドを苦手としていた人達でもとっつきやすいツールです。JDK7 Update 4(HotSpot 23)以降、まだ不完全ではありますがJRockit付属の強力な管理ツールと連携できるようにもなりました。また、InvokeDynamicが追加されたことにより、JVM上で動作するJava以外の言語の実行効率は大きく改善されつつあります。実行環境としてのJVMの地位を向上させたという点では、Java SE 7は評価に値するのではないかと、筆者は感じています。


12月3日の担当は @sugarlife さんです。お楽しみに!