Javaの起動について |
---|
Javaの起動についてのお話 一つ忠告 「どうやったら起動できるの?」ではなく「起動時はどうなってるの?」に着目した話です。 Javaもコンピュータで動作するものだからメモリ上に乗っかったり色々あります。 ただのclassファイルからJavaVMにロードするんだけどそこのところからお話します。 classファイルをロードするのをclassLoadって言って、 その役目をするのがClassLoaderなわけです 実はClassLoaderは種類がいくつかありますが Javaを実行したときにはまずブートストラップクラスローダーが呼ばれます あれ?「最初のクラスローダーはどいつが呼ぶの?」と思うかもしれません まぁそれはbinの中にいるjava.exeにでも聞いてください 実はブートストラップクラスローダーはJavaじゃなくC言語とかで書かれてるんだわ とりあえずここから全て始まっていくわけなんだ。ちなみにBootstrapはlib/tools.jarに入ってます だから環境変数classpathにtools.jarを入れとくわけですな (入れなくてもpathがjava.exeに通ってたら動くけど・・・) まずブートストラップクラスローダーはinitialクラスを生成してJavaVMを起動させます。 先に簡単に流れだけ言っちゃって、ClassLoaderがどのように探しているかは後回しにします まず、jre/lib/rt.jarとかをloadしようとします ● JavaVMの中に等価なデータ構造を生成 ⇒ heapの中のMethod Area に生成 ● ベリファイ(ロードしたclassが正しいかの検証) ● staticフィールドの生成、初期化 ⇒ heapの中のMethod Area にstaticフィールドを生成、初期化 ●コンスタントプールの決定 ⇒ class毎にclassIDとか実際の値を割り当てて参照できるようにする ⇒ classだけでなく、メソッド、インターフェース、フィールドも 参照場所わかれば後はどうにでもなるってわけですね。 参照わかったのとmain(String[])が実行されるのは別の話と考えてここまでにしときます。 ※配列の場合はちょっと動作が違うみたいです。調査不足なので時間があれば付け足します。 |