JDK7u4 の新機能について

(お詫び)
この記事は2ヶ月近く前に大半を執筆していたのですが、公開前のチェックをサボっていたために情報が古くなってしまいました。その間にJDK7もUpdate 4からUpdate 6に移行し、今はUpdate 8の開発が進んでいます。とは言え、Update 4の改良点はJDKu5~u8のそれよりも大きいため、まだ有効だと考えています。
「JDK7って何ですか?」という質問にはお答えできません。ご自分で調べて下さい。自分で調べるというプロセスそのものが新技術習得の第一歩となります。

JDK7 Update 4 (JDKu4) はMac OS X対応については多く取り上げられていますが、JRockitの一部機能が移植されていることはあまり話題にされていません。JDK7u4ではJava VMにHotSpot v23が搭載され、これがJRockitの機能の一部を取り込んでいます。これはOracleが進めている"HotRockit"プロジェクトの最初の機能プレビューともいうべきものです。

"HotRockit"プロジェクトはHotSpotとJRockitという2つのJava VMを統合してリソースを集中させようという試みです。実態はHotSpotへの一本化であり、これによって廃止されるJRockitから有益なツールをHotSpotに移植するのが主な取り組みとなります。

なお、この記事を執筆している時点での最新版はセキュリティフィックス版のJDK7u5であり、またMac OS X対応の積み残し解消を主としたJDK7u6が開発中です。

HotSpot v23で取り込まれたJRockitの機能は以下の3つです。
  • jrmd (ex. jrcmd)
  • Java Flight Recorder (ex. JRockit Flight Recorder)
  • JRockit互換MBean

jcmd
jcmdはJRockitに付属するjrcmdをHotSpotに移植したものです。基本的なコマンド書式は以下の通りで、これはjrcmdとほぼ同一です。
jcmd <pid> <command> ...
ただし、コマンド名は刷新されており、jrcmdとの互換性はありません。以下にjcmdのコマンド一覧と、それに対応するjrcmdのコマンドを示します。

jcmdとjrcmdのコマンド対応表
jcmdjrcmd
helphelp
ManagementAgent.stopkill_management_server
ManagementAgent.start_localstart_management_server local
ManagementAgent.startstart_management_server
Thread.printprint_threads
GC.class_histogramprint_object_summary
GC.heap_dumphprofdump
GC.run_finalizationrunfinalization
GC.runrunsystemgc
VM.uptimetimestamp
VM.flagslist_vmflags
VM.system_propertiesprint_properties
VM.command_linecommand_line
VM.versionversion
VM.commercial_features※1 該当なし
JFR.stopstop_flightrecording
JFR.startstart_flightrecording
JFR.dumpdump_flightrecording
JFR.checkcheck_flightrecording

現時点ではjrcmdの全コマンドが移植されているわけではありません。ロードマップではもう少し後にjcmdの拡張が予定されているので、その段階でjrcmdの全コマンドが移植されると考えられます。

※1 jcmdで新たに追加されたコマンドに VM.commercial_features がありますが、これは商用オプションの有効/無効を表示するコマンドです。このコマンドが追加されたのは、Java Flight Recorderなど有償サポート契約がないと使用できないオプションを制御するためです。

Java Flight Recorder
Java Flight Recorderは、名前から推察されるようにJRockit Flight RecorderをHotSpotに移植したものです。現時点では試験的実装となっていますが、フライト記録の採取など基本的な部分は実装されています。
Java Flight Recorderのフライト記録形式はJRockitのそれと同一で、従って現行のJRockit Mission Controlに読み込ませて内容を解析することができます。ただし、現時点ではMission ControlからJava Flight Recorderを直接制御することはできません。

Java Flight Recorderを使用するには、VMオプションに以下の2つを追加します。
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
最初のオプションは商用オプションにかけられたロックを解除するものです。jcmdの項でも示したように、Java Flight Recorderは正式リリース後には有償サポート契約が必要となります。他に有償サポート契約が必要なVM側のオプションにはDeterministic GC(未実装)が予想されます。有償サポート契約が必要なオプションでも、Mission ControlについてはVMのMBeanに接続するだけですので(現状では)追加のVMオプションは不要です。
2番目のオプションがJava Flight Recorderを有効にするものです。これによりjcmdのJFR.*系コマンドでフライト記録の採取開始・終了・ダンプ取得などができるようになります。

上記のVMオプションがない場合はフライト記録を取得することができません。jcmdのpid単位のヘルプを参照することでフライト記録の取得可否を判別することができます。
jcmd <pid> help
フライト記録を取得できる場合にはJFR.*系コマンドが表示され、そうでない場合は表示されません。

JRockit互換MBean
JDK7u4以降のMBeanはJRockitと互換性があります。これが意味するところは、HotSpotをJRockit Mission Controlにて監視することができることにあります。これまでもJDK付属のVisualVMでHotSpot状態監視はできましたが、今後はMission ControlでもHotSpotの状態監視ができるようになります。
なお、Mission Controlは現行のJRockitでも有償オプションであり、HotRockitプロジェクトによる統合後も有償サポート契約がある場合のみ提供される予定です。

とはいうものの、通常のパフォーマンス監視目的ならVisualVMでも十分すぎるほどの機能があります。

なお、OTN開発ライセンスの下ではMisson Controlを含むJRockitの全機能を無償で利用することができるため、技術検証目的であれば高額なJava SEの有償サポート契約は不要です(Java SEの有償サポートはライセンス単価だけ見ると安価ですが契約最小数がSun時代でも100とかだったので結果的にかなり高く付きます)。



補足情報:JDK8のロードマップ最新版
この記事の執筆を中断している間に、JDK8に関する最新のロードマップと新機能一覧 http://openjdk.java.net/projects/jdk8/features が公表されました。

この情報によるとJDK8(すなわちJava SE 8)のリリースは2013年9月予定、当初の二本柱の片割れである"Project Jigsaw"はJDK9へ持ち越し、BASE64を取り扱うAPIが正式に追加、それからようやくJSR 310 (Date and Time API)のマージなどが行われる予定です。もちろんJavaFX 3.0の統合もあります。

HotSpot関連で気になるのはDeterministic GCに関する記述がないこと。JDK8では見送りと言うことでしょうか?

Deterministic GCとG1GCは同じ目標に対して別々のアプローチを取っているに過ぎず、現行のG1GCが不得手だと言われる低リソース下での挙動が改善されれば、Deterministic GCの出番はなくなるわけです(Deterministic GCは事実上世代別GCを無効化するため、他のGCアルゴリズムとは一線を画す)。

JRockitのDeterministic GC自体、確か他のGCアルゴリズムでは十分なパフォーマンスを得られない場合の代替案だったはずなので、G1GCが改善されればなくなってもいいかな?というのが筆者の主観です。