84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
一运行就全部加载?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
すべてをロードするのではなく、オンデマンドでロードすると理解できます。 たとえば、継承された親クラス、実装されたインターフェイス、宣言された変数、メソッドの戻り値の型など。
つまり、現在のクラスを使用する場合、不足している必要なクラスはすぐにロードされます。
オンデマンドでロードします。 クラスロードのタイミング:
1) new、getstatic、putstatic、または invokestatic の 4 つのバイトコード命令が発生したとき、クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。これら 4 つの命令を生成する最も一般的な Java コード シナリオは次のとおりです。 new キーワードを使用してオブジェクトをインスタンス化するとき、クラスの静的フィールド (final によって変更され、結果はコンパイル時に定数プールに入れられる) の読み取りまたは設定を行うとき).フィールド)、およびクラスの静的メソッドを呼び出すとき。 2) java.lang.reflect パッケージのメソッドを使用してクラスへのリフレクション呼び出しを行う場合、クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。 3) クラスを初期化するときに、その親クラスが初期化されていないことが判明した場合は、最初に親クラスの初期化をトリガーする必要があります。 4) 仮想マシンの起動時に、ユーザーは実行するメイン クラス (main() メソッドを含むクラス) を指定する必要があり、仮想マシンは最初にメイン クラスを初期化します。 5) JDK 1.7 の動的言語サポートを使用する場合、java.lang.invoke.MethodHandle インスタンスの最終解析結果が REF_getStatic、REF_putStatic、REF_invokeStatic のメソッド ハンドルであり、このメソッド ハンドルに対応するクラスがまだサポートされていない場合初期化された場合は、最初に初期化をトリガーする必要があります。 クラスの初期化をトリガーするこれらの 5 つのシナリオでは、仮想マシン仕様では非常に強力な修飾子「はいおよびのみ」が使用されます。これらの 5 つのシナリオの動作は、クラスへのアクティブ参照と呼ばれます。さらに、クラスを参照するすべてのメソッドは初期化をトリガーせず、受動的参照と呼ばれます。
出典: JVM 7.2 クラスロードのタイミングについての深い理解
私はまだこれを深く理解していないので、他の人を誤解させることは敢えてしません。 仮想マシンの実行中に、java.lang パッケージの下にあるクラスなど、よく使用されるクラスがプリロードされることはわかっています。 プログラム内で参照するクラスファイル/jarパッケージに関しては、ロード処理が発生します。 仮想マシンがクラス ファイルを必要とする場合、デフォルトの classLoader.loadClass() を呼び出してロードします。このメソッドは、ロードされたクラスを最初に検索します。見つからない場合は、当然、そのクラスが返されます。それは親ローダーに渡されます。レイヤーごとに検索した後、classLoader は findClass メソッドを呼び出してファイルをロードします。 protected Class<?>loadClass(文字列名、ブール値解決)
http://blog.csdn.net/briblue/...このブログはとても良いので参考にしてください
すべてをロードするのではなく、オンデマンドでロードすると理解できます。
たとえば、継承された親クラス、実装されたインターフェイス、宣言された変数、メソッドの戻り値の型など。
つまり、現在のクラスを使用する場合、不足している必要なクラスはすぐにロードされます。
オンデマンドでロードします。
クラスロードのタイミング:
1) new、getstatic、putstatic、または invokestatic の 4 つのバイトコード命令が発生したとき、クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。これら 4 つの命令を生成する最も一般的な Java コード シナリオは次のとおりです。 new キーワードを使用してオブジェクトをインスタンス化するとき、クラスの静的フィールド (final によって変更され、結果はコンパイル時に定数プールに入れられる) の読み取りまたは設定を行うとき).フィールド)、およびクラスの静的メソッドを呼び出すとき。
2) java.lang.reflect パッケージのメソッドを使用してクラスへのリフレクション呼び出しを行う場合、クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。
3) クラスを初期化するときに、その親クラスが初期化されていないことが判明した場合は、最初に親クラスの初期化をトリガーする必要があります。
4) 仮想マシンの起動時に、ユーザーは実行するメイン クラス (main() メソッドを含むクラス) を指定する必要があり、仮想マシンは最初にメイン クラスを初期化します。
5) JDK 1.7 の動的言語サポートを使用する場合、java.lang.invoke.MethodHandle インスタンスの最終解析結果が REF_getStatic、REF_putStatic、REF_invokeStatic のメソッド ハンドルであり、このメソッド ハンドルに対応するクラスがまだサポートされていない場合初期化された場合は、最初に初期化をトリガーする必要があります。
クラスの初期化をトリガーするこれらの 5 つのシナリオでは、仮想マシン仕様では非常に強力な修飾子「はいおよびのみ」が使用されます。これらの 5 つのシナリオの動作は、クラスへのアクティブ参照と呼ばれます。さらに、クラスを参照するすべてのメソッドは初期化をトリガーせず、受動的参照と呼ばれます。
出典: JVM 7.2 クラスロードのタイミングについての深い理解
私はまだこれを深く理解していないので、他の人を誤解させることは敢えてしません。
リーリー仮想マシンの実行中に、java.lang パッケージの下にあるクラスなど、よく使用されるクラスがプリロードされることはわかっています。
プログラム内で参照するクラスファイル/jarパッケージに関しては、ロード処理が発生します。
仮想マシンがクラス ファイルを必要とする場合、デフォルトの classLoader.loadClass() を呼び出してロードします。このメソッドは、ロードされたクラスを最初に検索します。見つからない場合は、当然、そのクラスが返されます。それは親ローダーに渡されます。レイヤーごとに検索した後、classLoader は findClass メソッドを呼び出してファイルをロードします。
protected Class<?>loadClass(文字列名、ブール値解決)
http://blog.csdn.net/briblue/...
このブログはとても良いので参考にしてください