java程序运行的时候,是把所有的class文件都加载到内存吗?还是用的什么加载什么?
高洛峰
高洛峰 2017-04-18 10:49:58
0
4
537

一运行就全部加载?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(4)
洪涛

すべてをロードするのではなく、オンデマンドでロードすると理解できます。
たとえば、継承された親クラス、実装されたインターフェイス、宣言された変数、メソッドの戻り値の型など。

つまり、現在のクラスを使用する場合、不足している必要なクラスはすぐにロードされます。

いいねを押す +0
Peter_Zhu

オンデマンドでロードします。
クラスロードのタイミング:

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 クラスロードのタイミングについての深い理解

いいねを押す +0
巴扎黑

私はまだこれを深く理解していないので、他の人を誤解させることは敢えてしません。
仮想マシンの実行中に、java.lang パッケージの下にあるクラスなど、よく使用されるクラスがプリロードされることはわかっています。
プログラム内で参照するクラスファイル/jarパッケージに関しては、ロード処理が発生します。
仮想マシンがクラス ファイルを必要とする場合、デフォルトの classLoader.loadClass() を呼び出してロードします。このメソッドは、ロードされたクラスを最初に検索します。見つからない場合は、当然、そのクラスが返されます。それは親ローダーに渡されます。レイヤーごとに検索した後、classLoader は findClass メソッドを呼び出してファイルをロードします。
protected Class<?>loadClass(文字列名、ブール値解決)

リーリー
いいねを押す +0
伊谢尔伦

http://blog.csdn.net/briblue/...
このブログはとても良いので参考にしてください

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!