8.1.19例:アンインストールGreeterクラスは到達することはできません

8.1.19例:アンインストールGreeterクラスは到達することはできません

仮想マシンは、以下の手順のようにアンロードするときにダイナミック型負荷の例としては、アクセス不能になります。

参照されるクラス(ここではHowDoYouDo)はGreeterClassLoaderオブジェクトをロードしたため。loadClass()要求は、まず親に割り当てられますので、両方のクラスは、最終的には、ブート・クラス・ローダーをロードされますどのような場合には、JavaのAPIの一部です。

システムクラスローダ - 独自のディレクトリに基づいてGreeterClassLoader()メソッドの試行中にloadClass要求された種類の前に検索で、その親を呼び出します(ここではディレクトリグリーター)を覚えておいてください。システムは、その親がそう繰り返し、自身の親に任命しません、その親に割り当てられた最初のクラスローダになります。findSystemClass決勝は()と呼ばれるブートクラスローダーに委譲、鎖の末端に委任されています。(findSystemClass()によって)ブートクラスローダーがロードおよびjava.lang.Systemのjava.io.PrinlStream、のloadClass()メソッドは、単にクラスの例を(返すことができるため)findSystemClassから返されます。これらのクラスはGreeterClassLoader・オブジェクト定義されたものとしてマークされていないが、ブートクラスローダによって定義されるようにマークされています。あなたはGreeterClassLoaderオブジェクトのloadClass()メソッドを呼び出すことはありません開始はjava.lang.Systemに、java.io.PrintStreamからの参照または仮想マシンを解決したい場合は、いないシステムクラスローダは、クラスローダの直接の使用を開始します。

サプライズクラスとクラスHowDoYouDo:サプライズ挨拶()メソッドが戻った後、GreeterClassLoaderとしてマークされてオブジェクト定義の2種類があります。どちらのタイプは、仮想マシン内のオブジェクトによって定義されたGreeterClassLoaderタイプリストを設置します。

挨拶()メソッドが戻ると、プログラムのクラス驚きHowDoYouDo例の驚きは、触れることができます。ガベージコレクタは、アクセスするプログラムコードとしてクラスこれらの実施例の占有スペースを、再利用し、それらを使用していません。8-11クラスの2つのタッチの例のグラフィック記述です。

クラスサプライズの例では、2つの経路を介してアクセス可能であってもよいです。まず、GreetAndForgetローカル変数Cのmain()メソッドは、直接触れることができます。第二に、それはグリーターO、およびローカル変数に到達することができ、それらは同じサプライズオブジェクトを指します。驚きオブジェクトタイプ、オブジェクト驚き、仮想マシンデータを介してアクセスすることができ、データ・タイプは、ポインタ驚きクラスオブジェクトを含みます。第三の方法は、GreelerClassLoader cをアクセスポイントにローカル変数iの主GreetAndForget()ゲルローカル変数であるクラスのサプライズ・インスタンスへの参照を保持するHashtableオブジェクトを含むオブジェクト。(自己知覚:クラスとクラスローダを定義するクラスが相互に関係しています)



HowDoYouDoクラスのインスタンスは、二つの経路を介してアクセス可能であってもよいです。それは驚きでアクセス可能である第1の経路の経路:GreetAndForgetゲルのmain()メソッドは、ローカルHashtableオブジェクトが含まGreeterClassLoader子オブジェクトを対象とします。Hashtableオブジェクトは、クラスHowDoYouDo例への参照が含まれています。クラスのインスタンスに到達する2番目の方法は、一定のプールを通じてHowDoYouDoサプライズです。基準シンボルへの直接参照に置き換える、点HowDoYouDoサプライズシンボル基準定数プールから仮想マシンによって解析一度。データポイントのこのタイプは、直接参照、クラスA基準点HowDoYouDo例に含まれるデータのタイプをHowDoYouDo:したがって、定数プールサプライズから出発し、HowDoYouDoのクラスとしては、例えば、アクセス可能です。サプライズ直接参照定数プールそれから放出されるにしかし、なぜ、ガベージコレクタは、最初に注意を払う必要がありますか?サプライズクラスのインスタンスのので参照されます。ガベージコレクタは、それがクラスサプライズインスタンスに到達できることを見つけたとき、一定のプールから放出されたサプライズへの直接参照のいずれかのタイプがアクセス可能であることを満足しなければなりません。限りサプライズがまだアクティブであるとして、仮想マシンは、サプライズのいずれかのタイプを使用する場合がありますアンロードできません。

サプライズに到達することができますルートは、他のタイプは定数プールに関与しないがあり、上に示したことに注意してください。SurprisはシンボリックリファレンスとしてGreetAndForget定数プールに表示されません。サプライズの存在を認識していないコンパイル時にGreetAndForget。GreetAndForgetプログラムは、サプライズの実行時のロードと接続クラスで決定されます。したがって、クラスのクラスサプライズインスタンスは、ローカル変数は、main()メソッドをGreetAndForgetからのみアクセスすることができます。それはサプライズのために良い(最終はHowDoYouDoも同じである)、この生命維持「わら」の根は非常に強力ではないではありません。次の4つのステートメントでは、main()メソッドは、完全に状況の触知を変更しますGreetAndForget:

4つのステートメントは、すべてのクラスのインスタンスサプライズの開始点がnullになっ到達することができます。結果は実行4文の後に、サプライズインスタンスのクラスは、もは​​や触れることができる、ということではありません。これらの記述は、HowDoYouDoが到達できないクラスのインスタンスを作成します。Oので、元の変数の点はサプライズ・インスタンスをgrceterこと、可変ポイントGreeterClassLoaderゲルインスタンス、オブジェクト・クラス変数GreeterClassLoaderハッシュテーブルインスタンスにポイント。現在、これらの4つのオブジェクトは、ごみを収集することができます。

それは解放され、関連する方法同時に領域におけるHowDoYouDoサプライズ型データとすることができる場合に驚きとHowDoYouDoクラスのガベージコレクタ処理及び放出はもはやインスタンスを参照しない場合。これらのクラスのクラスインスタンスがアクセスできないので、自分自身もアクセスできませんこれらのタイプは、仮想マシンをアンロードすることができます。

再び、GreetAndForgetプログラムをforループ、それを注意してください、その後、後の2サイクル(上記のコマンドラインを想定) - 負荷クラスサプライズまでの時間を。仮想マシンが最初のサイクルでロードされたデータのサプライズ型を再利用していないことに注意してください。ループの最初のパスの終了時に、既にされているデータの種類がアンインストール許可します。しかし、ループの最初のパスの端部は、もはや参照されなくてもなる未サプライズクラスのインスタンスと、第3の時間周期は最初のパス、データの種類で再利用及び再利用することができません。

各サイクルでは、main()メソッドは、新しいGreeterCIassLoaderオブジェクトを作成GreetAndForget。したがって、各- GreetAndForgetのグリータのは、異なるユーザ定義のクラスローダによってロードロードされます。あなたが使用している場合たとえば、コマンドはこんにちはGreetAndForgetのラインプログラムを呼び出すために歓迎5回列挙され、プログラムは、クラスGreeterClassLoaderの5つのインスタンスを作成します。こんにちは、ようこそさんは5回5異なるユーザ定義のクラスローダでロードされます。メソッド領域は、こんにちは、データ型の5つのコピーを保存しています。スタックの代表はクラス5クラスのHelloのインスタンスを保存されます-
一人一人のローディング名前空間には、こんにちはを持っています。唯一のクラスに関連付けられているこの特定のインスタンスとのデータの種類がアンロードに許可されるとき、こんにちはた場合こんにちは、もはやなっクラスのインスタンスを参照します。

 

おすすめ

転載: www.cnblogs.com/mongotea/p/11979908.html