remove
powerd by nog twitter

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[])が実行されるのは別の話と考えてここまでにしときます。
※配列の場合はちょっと動作が違うみたいです。調査不足なので時間があれば付け足します。



Java Tips       TOP