10月18日,Oracle は Java 7 Update 1 をリリースした。Java 7 に要望の多かった安定性の向上と,パフォーマンス最適化の問題のフィックスを提供する。これは我々が 以前に報告した 問題で,HotSpot コンパイラが 正しくない結果 や,さらには SIGSEGV クラッシュを起こすことがある,というものだ。JDK 6 も Update 29 でこの問題に対処する。ただしこちらは,プロダクションサーバでは推奨されないオプションである -XX:+AggressiveOpts または -XX:+OptimizeStringConcat を指定した場合にのみ発生する。
Oracle は Java HotSpot Virtual Machine Performance Enhancements という資料を公表して,パフォーマンスに関連するその他の機能について説明をしている。かなり短い資料で,取り上げられているのは -XX:+TieredCompilation という新機能ひとつだけだ。
Tiered Compilation (階層型コンパイル) は,コンパイラの従来の mixed mode の動作に新たなステップを追加する。Java 7 以前の サーバクラス JVM では,最初にインタプリタモードでコードを実行して統計情報の収集を行っている。コードがコンパイルおよび最適化されるのはそれが Hot であるとき,すなわち実行回数が多い場合のみであって,HotSpot VM という名前もこれに由来する。しかしインタプリタモードは,コンパイルされたコードの実行に比較すると非常に遅いので,-XX:+TieredCompilation を使うことによって,コンパイル済コードの実行中に JVM が最適化のための統計情報を収集可能にする。
この改良の有効性はそれほど高くはないと思われる。サーバのスタートアップ時の処理時間は,デスクトップやアプレットベースのアプリケーションほど重要ではないからだ。ただし非常にダイナミックなシステムにおいて各ノードがすばやく立ち上がる必要のある場合などには,この変更でウォームアップ時間を短縮できるかも知れない。
JVM 7 の紹介ページにリストアップされているその他の改良点は,Java 6 ですでに利用可能なものばかりだ。
- Compressed Oops (圧縮 oop, oop=Ordinary Object Pointers) Java 6 Update 14 で提供,Update 23 よりデフォルト (64 bit のみ)
- Escape Analysis (エスケープ解析) Java 6 Update 14 で提供,Update 23 よりデフォルト
- Non Uniform Memory Access Garbage Collection (非均一メモリアクセス・ガベージコレクション) Java6 Update 2 で提供
Compressed Oops は 64 bit アドレスでのメモリ使用量を削減するものだ。JVM はオペレーティングシステムから取得する 64 bit アドレスに代えて,ヒープ先頭からの相対位置を示す,より短いアドレスを使用してオブジェクトを参照する。オブジェクト参照のメモリ使用量を削減できるため,ほとんどのプログラムで大きなメリットが期待できる。
Escape Analysis は新たに割り当てられたオブジェクトが,現在のメソッドのスコープを "エスケープ" するかどうかを判断する機能だ。エスケープしないオブジェクトはメソッドスタックに配置され,同期処理 (synchronization) も取り除かれる (ロックの省略)。この最適化の効果に関しては,Heinz Kabutz 氏の記事 に包括的な説明がある。
Non Uniform Memory Access Garbage Collection は興味深い改良だが,かなり前から提供されているものだ。最近のメモリアーキテクチャでは,他の部分よりも高速に読み書き可能なメモリ領域が存在する。特にマルチコアシステムにおいては,各 CPU 用にメモリ領域が確保されている。このようなメモリ領域について関心のある読者は,Ulrich Drepper 氏の優れた記事 からさらに学ぶことができる。JVM はオブジェクトのアロケーションを実行する時,そのスレッドを実行する CPU コアが使用しているメモリ上への配置を試みる。パフォーマンス向上効果は非常に高い (特に Solaris マシン上では) とされているが,-XX:+UseNUMA オプションがデフォルトになったことはない。
改良点の大部分が Java 6 Update ですでに提供されている (さらにデフォルトにもなっている) ので,パフォーマンス面に関しては,Java 7 をアップデートすべき積極的な理由はない。