類的卸載:由JVM自帶的類加載器所加載的類,在JVM的生命週期中,始終不會被卸載。JVM自己會始終引用這些類加載器,而這些類加載器始終引用它們所加載的類的Class對象。因此說,這些Class對象始終是可觸及的。 spa
System.out.println("第一次開始加載Sample類"); Class<?> clazz = ClassLoader.getSystemClassLoader().loadClass(Sample.class.getName()); Object obj = clazz.newInstance(); System.out.println(clazz.hashCode()); // 2018699554 obj = null; clazz = null; System.gc(); System.out.println("第二次開始加載Sample類"); clazz = ClassLoader.getSystemClassLoader().loadClass(Sample.class.getName()); System.out.println(clazz.hashCode()); // 2018699554 Thread.sleep(2000); System.out.println("執行結束....");
控制檯輸出:code
此例也說明,由系統類加載器加載的類不會被卸載,而且只加載一次,Class對象也只有一個對象
System.out.println("開始加載Sample類"); MyClassLoader myClassLoader = new MyClassLoader(); Class<?> clazz = myClassLoader.findClass(Sample.class.getName()); Object obj = clazz.newInstance(); // 當表明類的Class對象不在被引用時,Class對象就會結束生命週期,類在方法區內的數據也會被卸載 obj = null; clazz = null; myClassLoader = null; System.gc(); Thread.sleep(2000); System.out.println("執行結束....");
控制檯輸出:blog