9

最近、Javaクラスローダーに触れ、誰かが電話をかけたときに段階的に何が起こるかを完全には理解していないことが突然認識されました

java -jar App.jar

まあ私は推測します

  1. JVMの新しいインスタンスが作成されます
  2. ClassLoaderを使用してメインクラスと他のクラスをロードします
  3. main()メソッドからバイトコードの実行を開始

しかし、それでも私はそれについてもっと知る必要があることがたくさんあると思います。

  • 起動時にロードするクラスと、一度必要なクラスを誰がどのように決定しますか?

私は2つの関連する質問を見つけましたが、Javaの現実にそれを適用する方法は説明されていません。

コンピュータプログラムを実行するとどうなりますか?

プログラムを実行するとどうなりますか?

4

4 に答える 4

2

•起動時にロードするクラスと、一度必要なクラスを誰がどのように決定しますか。

Javaクラスのロードの基本を理解する必要があります。最初に、ブートストラップクラスローダー(VM自体の一部としてネイティブに実装されます)がコアシステムクラスのロードを担当します。次に、Extension、system、ユーザー定義(オプション)のクラスローダーなど、クラスをいつどのようにロードするかを決定する他のクラスローダーがあります。 クラスローディングの基礎

于 2012-12-18T06:21:43.890 に答える
1

決定はクラスローダーによって行われます。さまざまな実装があり、そのうちのいくつかは可能なすべてのクラスをプリロードし、いくつかは必要に応じてクラスのみをロードします。

クラスをロードする必要があるのは、プログラムコードから初めてアクセスするときだけです。このアクセスは、そのクラスからのオブジェクトのインスタンス化、またはそのstaticメンバーの1つへのアクセスである可能性があります。通常、デフォルトのクラスローダーは、必要なときにクラスを遅延ロードします。

ただし、一部のクラスは、どのような場合でもプリロードに依存できません。を介してアクセスされるクラスClass.forName(...)は、このコードが実際に実行されるまで決定されない場合があります。

他のオプションの中でも、簡単な実験では、静的初期化コードを使用して、クラスが実際にロードされる実際の時間と順序を確認できます。このコードは、クラスが初めてロードされるときに実行されます。例:

class SomeClass {

    static {
        System.out.println("Class SomeClass was initialized.");
    }

    public SomeClass() {
        ...
    }

    ...

}
于 2012-12-18T06:21:56.883 に答える
0

この例は、実行可能jarを示しています。これは、マニフェストファイル(フォルダーにある)に追加のキーと値のペアが含まれる通常のJavaアーカイブ(jar)"META_INF"です。キーは「Main-Class」であり、値は、例のようにjarを「実行」した場合に、「main」メソッドが実行されるそのクラスの完全修飾クラス名です。

jarはzipファイルであり、すべてのzipアーカイブツールで内部を確認できます。

于 2012-12-18T06:27:14.953 に答える
0

Javaプログラムをコンパイルするときはいつでも、次の手順が実行されます。

  1. まず、クラスローダーがクラスをJVMにロードします。
  2. コマンドjavacfilename.javaを指定した後コンパイラはコンパイル時エラーをチェックし、すべてが正常である場合は、.Classファイル(バイトコード)を生成します。

これが最初のフェーズになります。

その後、インタプリタはランタイムエラーをチェックし、例外なくすべてが正常である場合、インタプリタはバイトコードを実行可能コードに変換します。

Javaの最初のフェーズは、JITコンパイラー(Just In Time)によって実行されます。

于 2015-07-10T06:39:03.650 に答える