IBM 64-bit Runtime Environment for Windows AMD64 architecture, Java 2 Technology Edition, Version 1.4.2

Runtime Environment ユーザー・ガイド


著作権情報

: 本書および本書で紹介する製品をご使用になる前に、『特記事項』に記載されている情報をお読みください。

本書は、IBM 64-bit Runtime Environment for Windows AMD64 architecture, Java 2 Technology Edition, Version 1.4.2、および新しい版で明記されていない限り、以降のすべてのリリースおよびモディフィケーションに適用されます。

(c) Copyright Sun Microsystems, Inc. 1997, 2003, 901 San Antonio Rd., Palo Alto, CA 94303 USA. All rights reserved.

(c) Copyright International Business Machines Corporation, 1999, 2004. All rights reserved.

(c) Copyright IBM Japan 2004

まえがき

IBM(R) 64-bit Runtime Environment for Windows(R) AMD64 architecture, Java(TM) 2 Technology Edition, Version 1.4.2 には、Java 仮想マシン (JVM)、コア Sun Microsystems Java クラス、およびそれらをサポートするファイルが含まれています。Runtime Environment に、SDK パッケージにあるすべてのクラスが含まれているわけではありません。

本書には、Runtime Environment についての一般的な情報と、Runtime Environment の Sun のインプリメンテーションと IBM のインプリメンテーションの相違点についての情報を記載しています。本書は、Sun の Web サイト (http://java.sun.com) の詳細な資料と一緒にお読みください。

Runtime Environment は Microsoft(R) Windows XP 64-Bit Edition および Windows Server 2003 64-bit edition でサポートされています。

IBM JVM について詳しくは、「IBM JVM Diagnostics Guide」を参照してください。

SDK には、Java アプリケーションの実行のみを可能にする Runtime Environment for Windows が組み込まれていることに注意してください。SDK をインストールしている場合には、Runtime Environment が組み込まれています。

用語「Runtime Environment」と「Java 仮想マシン」は、本書を通じて読み替えることができます。

目次

著作権情報
まえがき
Runtime Environment の使用
IBM ビルド番号およびバージョン番号の取得
Java アプリケーションの起動
コマンドの要約
オプション
java コマンドのグローバリゼーション
クラスパスの処理
Java ファイルの自動実行
ガーベッジ・コレクション・ポリシーの指定
just-in-time (JIT) コンパイラー
RMI の Connection Handler Pool のインプリメント
JVM によるシグナルの処理方法
JVM が使用するシグナル
ネイティブ・コード・ドライバーをシグナル・チェーニング・ライブラリーにリンクする
IME を使った作業
中国語 (繁体字) での more コマンドの使用
特記事項
商標

Runtime Environment の使用

IBM ビルド番号およびバージョン番号の取得

IBM ビルド番号およびバージョン番号を確認するには、コマンド・プロンプトで以下を入力してください。

java -version

Java アプリケーションの起動

java ツールは Java アプリケーションを起動します。これは、Java の初期クラス名をパラメーターとして必要とします。これを指定しなかった場合、使用法のメッセージが出力されます。

JVM は、初期クラスと使用されるその他のクラスを、ブートストラップ・クラスパス、インストールされた拡張機能、ユーザー・クラスパスの 3 箇所で検索します。クラス名または JAR ファイル名の後の引き数が main 関数に渡されます。

javaw コマンドは、関連するコンソール・ウィンドウがないことを除けば、java とまったく同じです。コマンド・プロンプト・ウィンドウを表示したくない場合には javaw を使用してください。 javaw ランチャーは、起動に失敗した場合に、エラー情報を含むダイアログ・ボックスを表示します。

コマンドの要約

java および javaw コマンドの構文は次のとおりです。

java [ options ] class [ arguments ... ]
java [ options ] -jar file.jar [ arguments ... ]
javaw [ options ] class [ arguments ... ]
javaw [ options ] -jar file.jar [ arguments ... ]

大括弧で囲まれている項目はオプショナルです。

options
コマンド行オプション。
class
呼び出すクラスの名前。
file.jar
呼び出す jar ファイルの名前。-jar でのみ使用されます。
argument
main 関数に渡される引き数。

-jar オプションが指定された場合には、指定された JAR ファイルにアプリケーションのクラスおよびリソース・ファイルが入っていて、始動クラスは Main-Class マニフェスト・ヘッダーで示されています。

オプション

ランチャーには、現在の Runtime Environment でサポートされ、将来のリリースでサポートされる標準オプションのセットがあります。このほかに、非標準オプションのセットがあります。

標準オプション

非標準オプション

以下にリストした -X オプションは、非標準であり、予告なしに変更されることがあります。

java コマンドのグローバリゼーション

java コマンドやその他の java ランチャー・コマンド (javaw など) によって、クラス名を現行ロケールの文字セット内の任意の Unicode 文字として指定できます。

java エスケープ・シーケンスを使用して、クラス名と引き数に任意の Unicode 文字を指定することもできます。これを行うには、-Xargencoding を指定する必要があります。Unicode 文字を指定するには、エスケープ・シーケンスを ¥u#### の形式で使用します。ここで # は 16 進数字 (0 から 9、A から F) です。

あるいは、クラス名およびコマンド引数を UTF8 エンコード方式で指定するには、-Xargencoding:utf8 を使用し、ISO8859_1 エンコード方式で指定するには、-Xargencoding:latin を使用します。

java および javaw コマンドは、翻訳された出力メッセージを渡します。これらのメッセージは、Java を実行しているロケールによって異なります。java が戻す、エラーの詳細説明やその他のデバッグ情報は、英語で表示されます。

クラスパスの処理

クラス名を、フルパスおよび .class 拡張子を含む完全ファイル名として指定することができます。以前のバージョンでは、CLASSPATH に関連したクラスを指定できただけで、.class 拡張子は使用できませんでした。完全ファイル名を使用すれば、java アプリケーションをデスクトップやファイル・ランチャーから起動することができます。.class ファイルをパスおよび拡張子とともに指定すると、指定したパスが CLASSPATH に組み込まれます。 たとえば、コマンド java c:¥myapp¥thisapp.class は、 java -classpath c:¥myapp thisapp を指定した場合と同じ働きをします。

Java ファイルの自動実行

java クラスまたは jar ファイルをファイルから自動的に実行するように設定するには、Windows のエクスプローラーの 「ツール」->「フォルダ オプション」->「ファイル タイプ」オプションを使用します。あるいは、コマンド・プロンプトから次のように入力します。

assoc .class=javaclass 
ftype javaclass=C:¥Program Files¥IBM¥Java142¥jre\bin\java.exe %l %*
注:
  1. %l は英字の l であって、数字の 1 ではありません。
  2. Java が C:¥Program Files¥IBM¥Java142¥ 以外のディレクトリーにインストールされている場合には、ディレクトリーを置き換えます。

ガーベッジ・コレクション・ポリシーの指定

-Xgcpolicy JVM ランタイム・オプションは、ガーベッジ・コレクション・ポリシーを指定します。

-Xgcpolicy は、値として optthruput (デフォルト)、optavgpause、または gencon を使用します。このオプションは、ガーベッジ・コレクターの動作を制御して、アプリケーションおよびシステム全体のスループットとガーベッジ・コレクションに起因する休止時間とのトレードオフを行います。

このオプションの形式と値は次の通りです。

-Xgcpolicy:optthruput

-Xgcpolicy:optavgpause

-Xgcpolicy:gencon

休止時間

アプリケーションがオブジェクトを作成しようとしてその要求がヒープ内の使用可能スペースからすぐに満たされないとき、ガーベッジ・コレクターには、参照されていないオブジェクト (ガーベッジ) を識別してそれらを削除し、ヒープの状態を即時および後続の割り振り要求にすぐに応じられるような状態に戻す役割があります。そのようなガーベッジ・コレクションのサイクルによって、アプリケーション・コードの実行において予期しない休止が時々起こる場合があります。アプリケーションは大きく複雑になってきており、ヒープもそれに応じて大規模になっているので、このガーベッジ・コレクション休止時間は長さも重要度も増す傾向にあります。デフォルトのガーベッジ・コレクション値である optthruput は、これらの時々の休止 (ヒープのサイズとガーベッジの質によって数ミリ秒からかなりの秒数まであり得る) を犠牲にして、非常に高いスループットをアプリケーションにもたらします。

休止時間の削減

JVM では、以下の 2 つの技法を使用して休止時間を削減します。

-Xgcpolicy:optavgpause コマンド行オプションを指定すると、コンカレント・ガーベッジ・コレクションの使用が要求され、ガーベッジ・コレクション休止に費やす時間を大幅に削減することができます。コンカレント GC は、一部のガーベッジ・コレクション・アクティビティーを通常のプログラム実行と並行して実行して、ヒープの収集による分断を最小化することにより、休止時間を削減します。また、-Xgcpolicy:optavgpause オプションは、ヒープ・サイズの増加がガーベッジ・コレクション休止の長さに与える影響を制限します。-Xgcpolicy:optavgpause オプションは、大きなヒープを使用する構成の場合に、最も役立ちます。休止時間を削減することによって、アプリケーションのスループットがある程度減少する場合があります。

コンカレント・ガーベッジ・コレクション中に、その時に収集できない、比較的長期間存続しているオブジェクトを識別するために、かなりの量の時間が費やされます。GC が、再利用できる可能性の高いオブジェクトのみに集中すれば、一部のアプリケーションの休止時間をさらに削減することができます。世代別 GC では、ヒープを 2 つの「世代」、つまり「nursery」領域と「tenure」領域に分けることにより、これを実現します。オブジェクトは、その経過時間に応じて、これらの領域のいずれかに入れられます。nursery は 2 つのうちの小さい方であり、若いオブジェクトが入れられます。tenure は大きい方であり、古いオブジェクトが入れられます。オブジェクトは最初は nursery に割り振られます。これらのオブジェクトは、十分な期間生き残ると、プロモートされて、最終的に tenure 領域に移されます。

世代別 GC は、大部分のオブジェクトが長期間存続しないことを前提としています。世代別 GC では、最も再利用可能な空間を持つ nursery の空間の再利用に集中することで、休止時間を削減します。nursery の場合、ヒープ全体を収集するために時折長い休止時間をとる代わりに、収集が頻繁に行われます。また、nursery の大きさが十分に小さければ、休止時間は比較的短期間になります。ただし、世代別 GC には、長期間存続しているオブジェクトの数が多すぎる場合、時間がたつと tenure 領域がいっぱいになる可能性があるという欠点があります。この状態が発生したときに休止時間を最小化するには、コンカレント GC と世代別 GC を組み合わせて使用します。-Xgcpolicy:gencon オプションは、コンカレント GC と世代別 GC の組み合わせを使用することを要求することで、任意のガーベッジ・コレクション休止に費やされる時間を最小化する手助けをします。

ヒープが満杯の環境

Java ヒープが満杯に近く、再利用できるガーベッジが少ししかない場合、すぐに使用可能なスペースがないため、新規オブジェクト用の要求がすぐには満たされないことがあります。ヒープが容量いっぱいに近い状態で操作されている場合、上記オプションのどちらが使用されているのかには関係なく、アプリケーション・パフォーマンスは悪くなります。また、さらにヒープ・スペースの要求が続けば、アプリケーションはメモリー不足例外を受け取り、その例外がキャッチされ処理されなければ、JVM は終了します。この時点で、JVM は「javadump」という診断ファイルを作成します。このような状態の場合、-Xmx オプションを使用してヒープ・サイズを増やすか、使用中のアプリケーション・オブジェクトの数を減らすことをお勧めします。

just-in-time (JIT) コンパイラー

just-in-time (JIT) コンパイラー (jitc.dll) は、Java アプリケーションやアプレットの実行中に、頻繁に使用されるバイトコード・シーケンスのマシン・コードを動的に生成します。

Runtime Environment for Windows には JIT (jitc.dll) が組み込まれていて、デフォルトで使用できます。Java アプリケーション、アプレット、またはコンパイラー自体のいずれに問題があるかを判別するために、JIT を使用しないようにすることができます。

JIT を使用不可にするには、-Xint オプションを使用します。アプリケーションを実行するコマンド・プロンプト・ウィンドウで次のように入力します。

    java -Xint class

JIT が使用可能かどうかを確認するには、コマンド・プロンプトで次のように入力します。

    java -version

JIT が使用できる場合には、以下の入ったメッセージが表示されます。

(JIT enabled)

JIT が使用できない場合には、以下の入ったメッセージが表示されます。

(JIT disabled)

RMI の Connection Handler Pool のインプリメント

デフォルトでは、RMI Connection Handlers の スレッド・プーリングは使用可能になっていません

RMI TCPTransport レベルでインプリメントされた接続プーリングを使用可能にするには、以下のオプションを設定します。

-Dsun.rmi.transport.tcp.connectionPool=true (またはヌル以外の値)

このバージョンの Runtime Environment では、接続プール内のスレッド数を制限するために使用できる設定はありません。

詳しくは、Sun の Java のサイト http://java.sun.com を参照してください。

JVM によるシグナルの処理方法

JVM に関係のあるシグナルが生じると、シグナル・ハンドラーが呼び出されます。このシグナル・ハンドラーは、Java スレッドのために呼び出されたのか、または Java 以外のスレッドのために呼び出されたのかを判別します。

シグナルが Java スレッドのためのものである場合、JVM がシグナル処理の制御を行います。このシグナル用のアプリケーション・ハンドラーがインストールされていて、かつ、-Xnosigchain コマンド行オプションを指定しなかったときは、JVM の処理が完了した後で、このシグナル用のアプリケーション・ハンドラーが呼び出されます。

シグナルが Java 以外のスレッドのためのものであり、インストール済みのアプリケーションに、以前に JVM がそのシグナル用の独自のハンドラーをインストールしている場合、制御はそのハンドラーに与えられます。そうでない場合、JVM または Java アプリケーションによってシグナルが要求されると、シグナルが無視されるか、デフォルトのアクションが行われます。

この規則の例外は、Windows における外部的に生成されたシグナルの場合 (例えば、CTRL-BREAK を入力した場合) で、シグナル・ハンドラーを実行するために新しいスレッドが作成されます。この場合、JVM シグナル・ハンドラーはその処理を実行し、このシグナル用のアプリケーション・ハンドラーがインストールされていて、かつ、-Xnosigchain コマンド行オプションが指定されていないときは、このシグナル用のアプリケーション・ハンドラーが呼び出されます。

例外およびエラーのシグナルの場合、JVM は以下のいずれかを行います。

上記のフックを指定するランチャーを作成する方法について詳しくは、http://www-106.ibm.com/developerworks/java/library/i-signalhandling/ を参照してください。この項目は、Java V1.3.1 を対象に書かれたものですが、それ以降のバージョンにも適用されます。

割り込みシグナルの場合にも JVM は制御されたシャットダウン処理に入りますが、この場合は、以下を行う正常終了として扱われます。

このシャットダウンは、Java メソッド System.exit() を呼び出すことによって開始されるシャットダウンと同一です。

JVM が使用するその他のシグナルは内部制御の目的のものであり、終了の原因となることはありません。関係のある唯一の制御シグナルは SIGBREAK であり、Javadump を生成する原因となります。

JVM が使用するシグナル

下記の表 1 は、JVM が使用するシグナルを示したものです。これらのシグナルは、以下のように、タイプまたは使用法ごとに表内でグループ化されています。

表 1. JVM が使用するシグナル
シグナル名 シグナル・タイプ 説明 -Xrs による使用不可
SIGSEGV 例外 メモリーに対する誤ったアクセス (アクセス不能メモリーへの書き込み) なし
SIGILL 例外 正しくない命令 (不明なマシン・インストラクション呼び出しの試行) なし
SIGFPE 例外 浮動小数点例外 (0 除算) なし
SIGABRT エラー 異常終了。JVM が JVM 障害を検出すると、このシグナルを生じさせます。 なし
SIGINT 割り込み 対話式アテンション (CTRL-C)。 JVM は正常に終了します。 あり
SIGTERM 割り込み 終了要求。JVM は正常に終了します。 あり
SIGBREAK 制御 端末からのブレーク・シグナル。JVM は、Javadump を取るためにこれを使用します。 なし

-Xrs (シグナル使用の削減) オプションを使用して、 JVM がほとんどのシグナルを処理してしまうのを防止します。詳しくは、 http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html にある、Sun の Java アプリケーション・ランチャーのページを参照してください。

JVM スレッドに対するシグナル 2 (SIGINT)4 (SIGILL)6 (SIGABRT)8 (SIGFPE)、および 11 (SIGSEGV) により、JVM はシャットダウンします。したがって、アプリケーション・シグナル・ハンドラーでは、JVM のサービスを必要としなくなった場合を除き、これらのシグナルからのリカバリーを試みるべきではありません。

ネイティブ・コード・ドライバーをシグナル・チェーニング・ライブラリーにリンクする

Runtime Environment にはシグナル・チェーニングが含まれています。シグナル・チェーニングにより、JVM は、独自のシグナル・ハンドラーをインストールするネイティブ・コードとの、より効率的な相互操作が可能となります。

シグナル・チェーニングにより、アプリケーションでは、msvcrt.dll の前に共用ライブラリー jsig.dll にリンクしてロードすることが可能になります。jsig.dll ライブラリーにより、signal() の呼び出しが確実にインターセプトされ、それらのハンドラーが JVM のシグナル・ハンドラーを置き換えることがなくなります。代わりに、これらの呼び出しは、新しいシグナル・ハンドラーを保管するか、または JVM がインストールしたハンドラーの後にそれらを「チェーニング」します。後で、これらのシグナルのいずれかが生じ、JVM をターゲットとしたものではないことが分かった場合、プリインストールされたハンドラーが起動します。

jsig.dll を使用するには、それを JVM を作成または組み込むアプリケーションとリンクします。

IME を使った作業

IME を使って作業をしている時は、スクリーン上のワークスペースで漢字入力以外の操作をする前に、漢字入力と候補の選択を終わらせておくようにお勧めします。

中国語 (繁体字) での more コマンドの使用

中国語 (繁体字) のユーザーである場合には、Java アプリケーションからの出力をパイプを使用して直接 more コマンドに渡さないようにしてください。代わりに、出力を一時ファイルに送ってから、そのファイルを単独に表示するようにしてください。

特記事項

本書は米国 IBM が提供する製品およびサービスについて作成したものです。本書に記載の製品、サービス、または機能が日本においては提供されていない場合があります。日本で利用可能な製品、サービス、および機能については、日本 IBM の営業担当員にお尋ねください。本書で IBM 製品、プログラム、またはサービスに言及していても、その IBM 製品、プログラム、またはサービスのみが使用可能であることを意味するものではありません。これらに代えて、IBM の知的所有権を侵害することのない、機能的に同等の製品、プログラム、またはサービスを使用することができます。ただし、IBM 以外の製品とプログラムの操作またはサービスの評価および検証は、お客様の責任で行っていただきます。

IBM は、本書に記載されている内容に関して特許権(特許出願中のものを含む)を保有している場合があります。本書の提供は、お客様にこれらの特許権について実施権を許諾することを意味するものではありません。実施権についてのお問い合わせは、書面にて下記宛先にお送りください。

以下の保証は、国または地域の法律に沿わない場合は、適用されません。

IBM およびその直接または間接の子会社は、本書を特定物として現存するままの状態で提供し、商品性の保証、特定目的適合性の保証および法律上の瑕疵担保責任を含むすべての明示もしくは黙示の保証責任を負わないものとします。国または地域によっては、法律の強行規定により、保証責任の制限が禁じられる場合、強行規定の制限を受けるものとします。

この情報には、技術的に不適切な記述や誤植を含む場合があります。本書は定期的に見直され、必要な変更は本書の次版に組み込まれます。IBM は予告なしに、随時、この文書に記載されている製品またはプログラムに対して、改良または変更を行うことがあります。

本書において IBM 以外の Web サイトに言及している場合がありますが、便宜のため記載しただけであり、決してそれらの Web サイトを推奨するものではありません。それらの Web サイトにある資料は、この IBM 製品の資料の一部ではありません。それらの Web サイトは、お客様の責任でご使用ください。

IBM は、お客様が提供するいかなる情報も、お客様に対してなんら義務も負うことのない、自ら適切と信ずる方法で、使用もしくは配布することができるものとします。

本プログラムのライセンス保持者で、(i) 独自に作成したプログラムとその他のプログラム(本プログラムを含む)との間での情報交換、および (ii) 交換された情報の相互利用を可能にすることを目的として、本プログラムに関する情報を必要とする方は、下記に連絡してください。

本プログラムに関する上記の情報は、適切な使用条件の下で使用することができますが、有償の場合もあります。

本書で説明されているライセンス・プログラムまたはその他のライセンス資料は、IBM 所定のプログラム契約の契約条項、IBM プログラムのご使用条件、またはそれと同等の条項に基づいて、IBM より提供されます。

この文書に含まれるいかなるパフォーマンス・データも、管理環境下で決定されたものです。そのため、他の操作環境で得られた結果は、異なる可能性があります。一部の測定が、開発レベルのシステムで行われた可能性がありますが、その測定値が、一般に利用可能なシステムのものと同じである保証はありません。さらに、一部の測定値が、推定値である可能性があります。実際の結果は、異なる可能性があります。お客様は、お客様の特定の環境に適したデータを確かめる必要があります。

IBM 以外の製品に関する情報は、その製品の供給者、出版物、もしくはその他の公に利用可能なソースから入手したものです。IBM は、それらの製品のテストは行っておりません。したがって、他社製品に関する実行性、互換性、またはその他の要求については確証できません。IBM 以外の製品の性能に関する質問は、それらの製品の供給者にお願いします。

商標

IBM は、IBM Corporation の商標です。

Java およびすべての Java 関連の商標およびロゴは、Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。

Microsoft、Windows、Windows NT および Windows ロゴは、Microsoft Corporation の米国およびその他の国における商標です。

他の会社名、製品名およびサービス名などはそれぞれ各社の商標または登録商標です。

この製品には、Apache Software Foundation (http://www.apache.org/) によって開発されたソフトウェアが含まれています。