―Javaプログラミングの前提知識―
2001/5/12
javaコマンドを使いこなす |
今回の内容
|
基本的なjavaコマンドの使い方 実行を指定できるクラス、できないクラス javaコマンドのオプションを活用する |
javaコマンドはクラスファイルを実行するツールです。javacコマンドなどでソースファイルからコンパイルしたクラスファイルは、すべてこのjavaコマンドを介して実行されます。
クラスファイルとは、コンピュータ固有の環境(CPUなど)とは完全に独立した仮想的なコンピュータ、Java Virtual Machine(Java VM)上の実行ファイルのことです。javaコマンドは、このクラスファイルを実行するために、まずJava VMを起動します。起動したJava VMは、javaコマンドに指定されたクラスファイルを読み込み、その実行を開始します。以下では、このjavaコマンドの使い方について説明します。
なお、javaコマンドは基本的に、DOSプロンプトまたはコマンドプロンプト上で実行します。
基本的なjavaコマンドの使い方 |
■クラスの実行
javaでクラスを実行する方法は簡単です。DOSプロンプトまたはコマンドプロンプト上で、実行するクラスファイル名を指定してjavaコマンドを実行するだけです。例えば、カレントディレクトリ中に、クラスファイルWordProcessor.classと、その実行に必要なクラスファイルがすべて存在するときに、クラスWordProcessorを実行するには、次のように入力します。
java WordProcessor |
すると、Java VMが起動し、そのJava VMがクラスファイルWordProcessor.classを読み込み、実行を開始します。
■クラスパスの指定
クラスパスは、アプリケーションを実行するのに必要なクラスファイルをJava VMがどの"場所"から読み込めばよいかを指定するものです。
Java VMにクラスパスを指定するには、javaコマンドでクラスファイルを実行するときに、次のように入力します。
java -classpath <クラスパス> <実行するクラス名> |
クラスパスは、記号“;”(セミコロン)で区切られた複数の“場所”の指定から構成されます。“場所”には、具体的には、まずディレクトリが指定できます。そのほかにも、ZIPファイルとJARファイルという、複数のクラスファイルを1つにまとめたファイルを指定することができます。大抵のJavaのクラスライブラリはJARファイルで配布されるので、“場所”にこの種類のファイルを指定できるようになっています。例えば、カレントディレクトリ中のクラスWordProcessorが、その内部でディレクトリC:\lib中のクラスライブラリSpellChecker.jarを利用しているとします。ここで、SpellChecker.jarはJARファイル、すなわち複数のクラスファイルを1つのファイルにまとめたものです。このとき、クラスWordProcessorを実行するには、
java -classpath .;C:\lib\SpellChecker.jar
WordProcessor |
のように入力し、Java VMがクラスライブラリSpellChecker.jarの中身を検索できるようにしなければなりません(“.”はカレントディレクトリを表します)。さもなければ、Java VMは実行に必要なクラスファイルを見つけることができず、
Exception in thread "main"
java.lang.NoClassDefFoundError: <クラス名> |
のようなエラーメッセージを表示して終了してしまいます。クラスパスの指定で間違えがちなのが、カレントディレクトリの指定です。例えば、上の例で、次のようにカレントディレクトリをクラスパスに指定し忘れたとします。
java -classpath C:\lib\SpellChecker.jar
WordProcessor |
この場合に、Java VMはカレントディレクトリを検索しないので、クラスWordProcessorを見つけることができず、やはりエラーメッセージを表示して終了してしまいます。
なお、この-classpathオプションを指定せずにjavaコマンドを実行した場合には、Java VMは自動的にクラスパスをカレントディレクトリに指定します。クラスパスについての詳細は、「クラスパス(class path)を正しく使う」を参照してください。
なお、標準システムクラスライブラリや、エクステンションメカニズムでインストールしたクラスライブラリを利用する場合には、それらのクラスへのクラスパスを指定する必要はありません。詳しくは、「クラスパス(class path)を正しく使う」、「クラスパスを使わずクラスライブラリを利用する」を参照してください。
実行を指定できるクラス、できないクラス |
Java VMは実行を開始すると、まず最初にjavaコマンドで直接指定されたクラスの
public static void main(String[]) |
というメソッドを呼び出します。このメソッドが存在しないクラスはjavaコマンドに直接指定することはできません。もし実行しようとするクラスにpublic static void main(String[] )というメソッドが存在しなければ、Java VMは、
Exception in thread "main"
java.lang.NoSuchMethodException: main |
javaコマンドのオプションを活用する |
以下ではjavaコマンドに指定できるコマンドラインオプションについて説明します。
非常に多くのオプションがありますが、すべてのオプションについて知っている必要はありません。普通にクラスファイルを実行するだけならば、-classpathオプションの使い方を知っていれば十分です。
■標準オプション●javaコマンドの使い方を表示する
“-?”または“-help” |
これらのオプションを指定すると、javaコマンドは、javaコマンドの簡単な使い方を表示して、終了します。これは、オプションもクラスファイル名も何も指定せずにjavaコマンドを実行したときと同じです |
●クラスパスを指定する
-classpath <記号";"で区切られた複数のディレクトリ、JAR、ZIPファイル> |
このオプションを用いることで、Java VMのクラスパスを指定することができます。クラスパスについては、「クラスパス(class path)を正しく使う」を参照してください |
●Java VMのバージョンを表示させる(終了時)
-version |
このオプションを指定すると、javaコマンドはJava VMのバージョンを表示して終了します |
●Java VMのバージョンを表示させる(実行前)
-showversion |
このオプションを指定すると、クラスファイルの実行前に、javaコマンドはJava VMのバージョンを表示します。 |
●実行中に読み込むクラスファイルを表示させる
“-verbose” または“ -verbose:class” |
これらのオプションを指定すると、Java VMは実行中にクラスファイルを読み込むたびに、メッセージを表示します |
●ガーベッジコレクションの実行を知らせるメッセージを表示させる
-verbose:gc |
このオプションを指定すると、Java VMはガーベッジコレクションを行うたびに、メッセージを表示します。ガーベッジコレクションとは、利用されなくなったオブジェクトをヒープから取り除くことです |
●JNIの使用時にメッセージを表示させる
-verbose:jni |
このオプションを指定すると、Java VMはJava Native Interface(JNI)が使用されるたびに、メッセージを表示します。JNIとは、CPUまたはオペレーティングシステムに固有の実行コード、ネイティブコードをJava VMからアクセス、実行するためのインターフェイスです。逆に、JNIにより、ネイティブコードからJava VMにアクセスしたり、実行することができます |
●非標準オプションの内容を表示させる
-X |
このオプションを指定すると、非標準オプションについての説明が表示されます。非標準オプションについては以下の"非標準オプション"の説明を参照してください |
●JARファイルの実行を指定する
-jar |
このオプションを用いて、javaコマンドにクラスファイルではなくJARファイルを指定すると、Java VMはそのJARファイルから直接実行するクラスを読み込んで、実行することができます。この機能を用いるためには、JARファイルにどのクラスを最初にJava VMで実行すればよいかの情報を追加しておく必要があります。ここでは、その詳細については説明しません |
■非標準オプション
非標準オプションは、サン以外(マイクロソフト、IBMなど)のJava VMの実装では指定できる保証のないオプションです。また、将来のバージョンの実装では、これらのオプションが使用できなくなる可能性があります。
●実行効率を最適にする(JITを有効にする)
-Xmixed |
このオプションを用いると、Java VMはバイトコードインタプリタとネイティブコードコンパイラの両方を使って、最も実行効率がよくなるように、クラスファイルを実行します。Java VMは通常このように動作するので、特にこのオプションを指定する必要はありません。 バイトコードインタプリタとは、クラスファイルに書かれているJava VMの命令を1命令ずつ読み込んで実行するプログラムです。 ネイティブコードコンパイラとは、クラスファイルに書かれているJava VMの命令を読み込んで、それに対応するCPUの機械命令を生成するプログラムです。 |
●インタプリタで実行する
-Xint |
このオプションを用いると、Java VMはバイトコードインタプリタのみを用いてクラスファイルを実行します。 |
●外部のデバッガからのデバッグを有効にする
-Xdebug |
このオプションを指定すると、Java VMは、外部のデバッガからデバッグを行えるようになります。 |
●ブートクラスパスを指定したものに変更
-Xbootclasspath:<ブートクラスパス> |
ブートクラスパスを指定したものに変更します。ブートクラスパスについては、「クラスパス(class path)を正しく使う」を参照してください。 |
●ブートクラスパスを追加(最後に)
-Xbootclasspath/a:<追加するブートクラスパス> |
ブートクラスパスの最後に、指定したブートクラスパスを追加します。 |
●ブートクラスパスを追加する(先頭に)
-Xbootclasspath/p:<追加するブートクラスパス> |
ブートクラスパスの先頭に、指定したブートクラスパスを追加します。 |
●より厳密なクラスファイルのチェックを行う
-Xfuture |
このオプションを指定すると、Java VMはクラスファイルのチェックを正しいクラスファイルフォーマットの仕様に沿って厳密に行います。このオプションを指定しないと、Java
VMは古いJava VM(バージョン1.1時代)のクラスファイルチェックを行います。 |
●ガーベッジコレクションを無効にする
-Xnoclassgc |
このオプションを指定すると、Java VMは、クラスのガーベッジコレクションを行いません。 |
●ガーベッジコレクションのプログラム実行への影響を小さくする
-Xincgc |
このオプションを指定すると、Java VMは“インクリメンタルガーベッジコレクション”という方法の、ガーベッジコレクションを行います。この方法では、プログラムの実行中に、ガーベッジコレクションが発生してプログラムの実行が妨害されることがなくなります。ただし、ガーベッジコレクションそのものの性能は約10%低下するそうです。 |
●Java VMのヒープの初期サイズを指定する
-Xms<ヒープサイズ(バイト)> |
|
このオプションで、Java VMのヒープの初期サイズをバイト単位で指定することができます。このオプションで指定するヒープのサイズは、1024の倍数でかつ、1メガバイト以上でなければなりません。このオプションでは、キロバイトを表すのに記号“k”を、メガバイトを表すのに記号“m”を用いることができるので、これらを用いると1024の倍数を計算することなくヒープのサイズを指定することができます。例えば、ヒープの初期サイズを1024キロバイトに指定するには、次のように入力します。
|
●Java VMのヒープの初期サイズを指定する
-Xmx<ヒープサイズ(バイト)> |
|
このオプションで、Java VMのヒープの最大サイズをバイト単位で指定することができます。このオプションで指定するヒープのサイズは、1024の倍数でかつ、2メガバイト以上でなければなりません。 このオプションでは、キロバイトを表すのに記号“k”を、メガバイトを表すのに記号“m”を用いることができるので、これらを用いると1024の倍数を計算することなくヒープのサイズを指定することができます。例えば、ヒープの最大サイズを256メガバイトに指定するには、次のように入力します。
|
●プログラム終了時にCPUの簡単なプロファイリング結果を表示
-Xprof |
このオプションを指定すると、Java VMは、実行終了時に、非常に簡単なCPUのプロファイリング結果を表示します。 |
●プログラム終了時にCPUの詳細なプロファイリング結果を表示
-Xrunhprof |
|
このオプションを指定すると、Java VMの実行を詳細にプロファイリングすることができます。このオプションの詳しい使い方は、
と入力すると表示されますので、それを参照してください。 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|