名前空間のクラスとアンロード詳細および使用jvisualvm
名前空間:
- 各クラスローダは、独自の名前空間を持ち、クラスローダと、すべての親クラスローダによって名前空間は、クラスをロードしました。
- 同じ名前空間では、二つのクラス[(パッケージを含む)クラスの完全な名前と同じでは発生しません]。
- 別の名前空間では、二つのクラス[(のパッケージを含む)同一の完全なクラス名が存在してもよいです]。
またはMyTest16:
public static void main(String[] args) throws Exception {
MyTest16 loader1 = new MyTest16("loader1");
loader1.setPath("C:\\Users\\admin\\Desktop\\");
Class<?> clazz = loader1.loadClass("Jvm.MyTest10");
System.out.println("class:"+clazz.hashCode());
Object object = clazz.newInstance();
System.out.println(object);
System.out.println();
//这里做了改动,构造方法改为MyTest16(loader1,"loader2"); 使loader1作为loader2的父类加载器
MyTest16 loader2 = new MyTest16(loader1,"loader2");
loader2.setPath("C:\\Users\\admin\\Desktop\\");
Class<?> clazz1 = loader2.loadClass("Jvm.MyTest10");
System.out.println("class:"+clazz1.hashCode());
Object object1 = clazz.newInstance();
System.out.println(object1);
}
运行结果:
findClass invoked:Jvm.MyTest10
class loader name:loader1
class:1173230247
MyTest10 static block
Jvm.MyTest10@330bedb4
----------------------------------
class:1173230247
Jvm.MyTest10@2503dbd3
- 結果の分析:
- 操作は、上部の水平部に、結果から分かるMyTest16を処理loader1ロードされる(デスクトップJVM対応する文書のコピーは、クラスファイルを削除)、(システムクラスローダ)の親クラスローダを見つけるloader1負荷、loader1自身の負荷、その後、ロードされません。
- 以下の部分は水平線である、loader2は、親クラスローダ(loader1)負荷、親クラスを呼び出すときに直接的な方法は、ためにloadClass源の[オブジェクトを返すよう起因loader1は、ロードされた、親クラスに最初に行きます彼らはクラス]はローダーを持ってロードされる場合、ローダは、最初に決定するためにfindLoadedClass(String)を呼び出します。
またはMyTest16:
public static void main(String[] args) throws Exception {
MyTest16 loader1 = new MyTest16("loader1");
loader1.setPath("C:\\Users\\admin\\Desktop\\");
Class<?> clazz = loader1.loadClass("Jvm.MyTest10");
System.out.println("class:"+clazz.hashCode());
Object object = clazz.newInstance();
System.out.println(object);
System.out.println();
MyTest16 loader2 = new MyTest16(loader1,"loader2");
loader2.setPath("C:\\Users\\admin\\Desktop\\");
Class<?> clazz1 = loader2.loadClass("Jvm.MyTest10");
System.out.println("class:"+clazz1.hashCode());
Object object1 = clazz.newInstance();
System.out.println(object1);
System.out.println();
MyTest16 loader3 = new MyTest16(loader2,"loader3");
loader2.setPath("C:\\Users\\admin\\Desktop\\");
Class<?> clazz2 = loader3.loadClass("Jvm.MyTest10");
System.out.println("class:"+clazz2.hashCode());
Object object2 = clazz.newInstance();
System.out.println(object2);
}
运行结果:
findClass invoked:Jvm.MyTest10
class loader name:loader1
class:1173230247
MyTest10 static block
Jvm.MyTest10@330bedb4
class:1173230247
Jvm.MyTest10@2503dbd3
class:1173230247
Jvm.MyTest10@4b67cf4d
結果の分析:
- (削除されたファイルのうちのクラスファイル)はloader1自分の気持ちです!
クラスアンロード
- MYSAMPLEクラスがロードされ、接続と初期化、そのライフサイクルが開始されます。クラスオブジェクトがもはや、アンタッチャブルである、参照されるMYSAMPLEクラスを表していない場合、クラスオブジェクトは、ライフサイクルを終了する、方法エリア内MYSAMPLEクラスデータは、このようにライフサイクルMYSAMPLEクラスを終了、アンロードされます。
- クラスのライフサイクルの終わりには、代わって依存するとそのClassオブジェクトときライフサイクルの終わり。
- これは、仮想マシンのライフサイクルにクラスをロードするために、Java仮想マシンのクラスローダから来ているし、常にアンインストールされません。
- これは、導入された、Java仮想マシンは、クラスローダはルートクラスローダ拡張クラスローダは、システムクラスローダが来る含まれています。これらのクラスのオブジェクトは、常にアクセスできるようにするJava仮想マシン自体は、常に、常にそのクラスのClassオブジェクトをロードするクラスローダを参照するクラスローダを、参照します。
- ユーザ定義のクラスローダによってクラスをアンロードすることができるロードします。
- 等:サンプルクラスはloader1によってロードされ、Javaクラスのセットの存在を参照して、クラスローダの内部実装は、ロードされます。一方、Classオブジェクトは、常にClassオブジェクトのgetClassLoader()メソッドを呼び出して、クラスローダにそれを参照するには、クラスローダにそれを得ることができます。したがってアソシエーション間の双方向の関係、クラスインスタンスloader1代表サンプルクラス。
- **クラスのインスタンスは、常にこのクラスのClassオブジェクトに代わって呼ばれています。オブジェクト・クラスの定義**のgetClass()メソッドは、この方法の代表的なオブジェクトのクラスのクラスへの参照を返します。また、使用するJavaクラスは、静的プロパティクラスを持っていることは、このクラスのオブジェクトクラスの代表者を指します。
例:[クラスアン-XX:+ TraceClassUnloading]
public static void main(String[] args) throws Exception {
MyTest16 loader1 = new MyTest16("loader1");
loader1.setPath("C:\\Users\\admin\\Desktop\\");
Class<?> clazz = loader1.loadClass("Jvm.MyTest10");
System.out.println("class:"+clazz.hashCode());
Object object = clazz.newInstance();
System.out.println(object);
System.out.println();
loader1 = null;
clazz = null;
object = null;
System.gc(); //回收
Thread.sleep(10000); //<-----为了方便使用jvisualvm查看加载类和卸载类的过程
loader1 = new MyTest16("loader1");
loader1.setPath("C:\\Users\\admin\\Desktop\\");
clazz = loader1.loadClass("Jvm.MyTest10");
System.out.println("class:"+clazz.hashCode());
object = clazz.newInstance();
System.out.println(object);
System.out.println();
}
运行结果:
findClass invoked:Jvm.MyTest10
class loader name:loader1
class:1173230247
MyTest10 static block
Jvm.MyTest10@330bedb4
[Unloading class Jvm.MyTest10 0x00000007c0061828] <----打印类的卸载
findClass invoked:Jvm.MyTest10
class loader name:loader1
class:2125039532
MyTest10 static block
Jvm.MyTest10@12a3a380