Java 2 SDK 開発ガイド (Solaris 編)

新しい機能と強化された機能

この章では、Java 2 SDK Solaris 版の新しい機能と強化された機能について説明します。このリリースを使ってアプリケーションを開発すると、以下のような Java 2 プラットフォームの高度な機能を使用することができます。

さらに、Java 2 SDK Solaris 版では、Java Virtual Machine (VM) で次の点が強化されたためケーラビリティと性能が大幅に向上しました。

Java 2 SDK Solaris 版の製品リリースでは、アプリケーションの導入を支援する次の機能が提供されます。

高性能メモリシステム

Java 2 SDK Solaris 版には高度に最適化されたメモリシステムが組み込まれているため、メモリの割り当てやガベージコレクションが以前よりも効率的になります。このメモリシステムでは直接ポインタが使用されます。このメモリシステムには次の特徴があります。

このような機能により、プログラムの性能が向上し、ガベージコレクションのために対話プログラムが中断されることが少なくなります。

高性能メモリシステムの一部で次の機能が拡張されたため、システムの性能が大幅に向上します。

正確なガベージコレクション

Java 2 SDK Solaris 版では正確なガベージコレクションが行われます。このガベージコレクションでは、従来のシステムよりも広範囲なガベージコレクション技法が使われるため性能が向上します。

Java 2 SDK Solaris 版では、多くのアプリケーションに対して大幅に性能が向上する効率的な世代管理方式のガベージコレクタが使用されています。世代管理方式のガベージコレクションでは、割り当て済みオブジェクトのサブセットに対して、再利用が可能かどうかが検査されます。このサブセットの選択はオブジェクトの古さに基づいて行われ、そこでは新しい「世代」ほど頻繁に検査が行われます。このサブセット化を行うのは、Java プログラムでは、新たに作成されたオブジェクトほど、古いオブジェクトと比べて回収の対象である可能性が高いためです。通常、新しい世代の回収はすべてを回収する場合よりかなり短い時間で済むため、この手法には、ガベージコレクションのための一時停止時間が短縮されるという利点もあります。

この性能の向上を実現するには、ユーザが作成したネイティブコードを含めて、システム全体が正確なガベージコレクションをサポートしている必要があります。JNI (Java Native Interface) の実装では、正確なガベージコレクションに対応することができます。Java 2 SDK Solaris 版では、そうした実装が可能なため、JNI を使用して作成したネイティブコードは Java 2 SDK Solaris 版 VM に対してそのまま使用できます。

直接ポインタ

Java 2 SDK Solaris 版の正確なガベージコレクションでは、オブジェクトに対しハンドルの代わりに直接ポインタが使用されます。直接ポインタではオブジェクトをアクセスするための間接レベルが 1 つ除かれるため、メモリ使用量が減少し、割り当て速度が増し、システム性能が向上します。

ヒープにおけるダブルワード (long と double) の 8 バイト境界への位置合わせ

ヒープではダブルワード値は 8 バイト境界に位置合わせされます。そのため、SPARCTM システムで、変動しやすいダブルワード値を正確に保持しながら、ネイティブコードおよび JIT でコンパイルされた Java コードの性能が両方とも向上します。ただし、アプリケーションで小さいオブジェクトをたくさん割り当てて保持する場合は、ヒープサイズをいくらか増やす必要があるかもしれません。これらのオブジェクトは 8 バイトの倍数の境界に割り当てられるため、メモリ使用量が増加するからです。

マルチスレッド機能

同期処理におけるオーバーヘッドの軽減

次の各機能によりマルチスレッドアプリケーションの同期オーバーヘッドが減少するため、性能が向上します。

高速同期モニターロック/高速スレッド同期

Java 2 SDK Solaris 版では新しい高速ロックアルゴリズムが内部的に使用されるため、メソッドの同期化が効率的になります。この VM では、Java プラットフォームの同期化プリミティブの実装が大幅に拡張されました。この実装では、並行プログラムの実行が効率的になり、同期化プリミティブが単一スレッドのアプリケーション性能に与える影響が減少します。

ロック競合の抑制

Java 2 SDK Solaris 版は、スレッドに対してローカルなデータ構造を使用し、よりきめの細かいロックを行うことによって、VM においてできる限りロック競合が発生しないようにします。

VM のコアロックアーキテクチャは、よりきめの細かい VM ロックを行うことができます。このロックによって、競合するスレッド実行パスの数が最低限に押さえられます。競合するパスが少なくなるということは、あるスレッドの実行が他のスレッドを妨害する可能性が低くなることを意味します。これにより、マルチプロセッサ (MP) のスケーラビリティが改善されます。また、きめの細かいロックにより VM が大量の同時処理を行うことが可能になります。

スレッド固有データのアクセス

Java 2 SDK Solaris 版では、新しい内部キャッシュ機構を使用することにより、スレッド固有データにアクセスする時間を短縮しました。これは、VM と各プラットフォームに固有の JIT から実行環境データにアクセスする際に使われる一般的なパフォーマンス拡張機能です。

ツール

ヒープ検査ツール

この診断ツールは、SIGQUIT ハンドラメニューから終了されたプログラムに対して対話的に使用できます。このツールでは、プログラムのメモリリークを見つけることができます。メモリリークは、プログラムが不注意でオブジェクトを保持しているためにガベージコレクターがメモリを再利用できないときに起ります。ヒープ検査をすると、ヒープにあるオブジェクトがクラスごとに合計メモリ使用量の多い順に示されます。オブジェクトへの参照チェーンを調べると、オブジェクトがなぜ終了しないのかがわかります。

デバッグユーティリティ

Java 2 SDK Solaris 版では新しいデバッグプロセスが提供されます。このプロセスでは、フォアグラウンドで動作する Java プロセスに SIGQUIT シグナルを送信します。このシグナルを使えば、そのプロセスに対し、スレッドやモニターの状態ダンプ、デッドロック検出などのデバッグタスクを行うことができます。詳細は、第 5 章「SIGQUIT によるデバッグ」を参照してください。

最適化 JIT コンパイラ

最適化 JIT コンパイラは、Java アプリケーションの起動時に最大の実行速度が与えられるように Java Virtual Machine に指示します。JIT コンパイラの新しい最適化機能には、仮想および非仮想メソッドのインライン化、拡張基本ブロック内の CSE 処理、ループ解析 (配列境界の検査が不要になる)、高速の型検査など、SPARC プラットフォームと Intel (IA) プラットフォームの両方で最適化が実現されます。

インライン化

Java 2 SDK Solaris 版のインライン化を使うと、インライン化を手動で行う必要がなくなります (したがって、プログラムのモジュール性を損うこともありません)。自動インライン化は、フロー制御を含まない比較的小さな非同期メソッドに限られます。

混在モード実行

Java 2 SDK Solaris 版には、性能の大幅な向上を可能にする混在モード実行機能が新たに追加されています。混在モード実行では、VM は性能が重要となるメソッドだけをコンパイルして、残りのメソッドについてはインタプリタとして動作します。この機能はコンパイル時のオーバーヘッドを軽減し、プログラムの起動を高速化します。また、本当に重要な部分のコンパイルと最適化に多くの時間を割いて、性能の向上を図れるようにします。

混在モード実行は、デフォルトのモードです。混在モードでは、VM はメソッドを次の 2 つに分類します。

このそれぞれの種類に対して、JIT コンパイラがコンパイルのタイミングを決定します。ループを含む可能性があるメソッドは最初の実行時にコンパイルされます。ループを含まないメソッドの場合は、15 回目の呼び出し時にコンパイルが行われます。

スケーラビリティの向上

Java 2 SDK Solaris 版では、並行プリミティブや並行メソッドの処理が向上し、マルチスレッド (MT) プログラムの性能が向上し、多数のスレッドを使用するプログラムのガベージコレクションによる停止時間が大幅に減少します。

テキスト描画性能の向上

グラフィックの最適化により、ダイレクトグラフィックアクセス (DGA) サポートのない Solaris プラットフォームで、Java 2 SDK のテキスト描画性能が向上しました。ここでいう Solaris プラットフォームとは、UltraTM 5、Ultra 10、Intel で実行する Solaris (IA)、およびすべてのリモートディスプレイシステムです。

poller クラスのデモ

新しい poller クラスを使うと、Java アプリケーションから C の poll(2) ルーチンの関数に効率よくアクセスできます。Java 2 SDK Solaris 版のデモコードは、サンプル用サーバと一緒に以下のディレクトリにあります。

${JAVA_HOME}/demo/jni/Poller

デモでは、複数の入出力オブジェクトの入出力状態を 1 つの呼び出しで判定する方法が示されています。

poller クラスをサポートする JNI C コードは、Solaris 7 の poll(2) カーネルキャッシュ機能の利点を最大限に利用するように最適化されています。このコードは、高速カーネルポーリング機構 /dev/poll を利用するようにコンパイルできます。この機構は Solaris 7 system Software update 2 (5/99) 版とそれ以降のバージョンで使用できます。

poller クラスの詳細は、付録 C 「poller クラスの使い方」 を参照してください。