Java虚拟机类型卸载和类型更新解析 - 编程入门网
sLoaded = null;9 classLoader = null;1011 System.out.println("开始GC");12 System.gc();13 System.out.println("GC完成");14 } catch (Exception e) {15 e.printStackTrace();16 }17 }18 }
我们增加虚拟机参数-verbose:gc来观察垃圾收集的情况,对应输出如下:
【测试场景二】使用系统类加载器加载,但是无法将其设置为unreachable的状态 说明:将场景一中的MyClass类型字节码文件放置到工程的输出目录下,以便系统类加载器可以加载 1 public class Main {2 public static void main(String[] args) {3 try {4 Class classLoaded = ClassLoader.getSystemClassLoader().loadClass(5 "MyClass");678 System.out.printl(sun.misc.Launcher.getLauncher().getClassLoader());9 System.out.println(classLoaded.getClassLoader());10 System.out.println(Main.class.getClassLoader());1112 classLoaded = null;1314 System.out.println("开始GC");15 System.gc();16 System.out.println("GC完成");1718 //判断当前系统类加载器是否有被引用(是否是unreachable状态)19 System.out.println(Main.class.getClassLoader());20 } catch (Exception e) {21 e.printStackTrace();22 }23 }24 } 我们增加虚拟机参数-verbose:gc来观察垃圾收集的情况,对应输出如下:
由于系统ClassLoader实例(AppClassLoader@197d257">sun.misc.Launcher$AppClassLoader@197d257)加载了很多类型,而且又没有明确的接口将其设置为null,所以我们无法将加载MyClass类型的系统类加载器实例设置为unreachable状态,所以通过测试结果我们可以看出,MyClass类型并没有被卸载.(说明: 像类加载器实例这种较为特殊的对象一般在很多地方被引用,会在虚拟机中呆比较长的时间) Java虚拟机类型卸载和类型更新解析(3)时间:2011-01-03 zhuxing【测试场景三】使用扩展类加载器加载,但是无法将其设置为unreachable的状态 说明:将测试场景二中的MyClass类型字节码文件打包成jar放置到JRE扩展目录下,以便扩展类加载器可以加载的到。由于标志扩展ClassLoader实例(ExtClassLoader@7259da">sun.misc.Launcher$ExtClassLoader@7259da)加载了很多类型,而且又没有明确的接口将其设置为null,所以我们无法将加载MyClass类型的系统类加载器实例设置为unreachable状态,所以通过测试结果我们可以看出,MyClass类型并没有被卸载. 1 public class Main {2 public static void main(String[] args) {3 try {4 Class classLoaded = ClassLoader.getSystemClassLoader().getParent()5 .loadClass("MyClass");67 System.out.println(classLoaded.getClassLoader());89 classLoaded = null;1011 System.out.println("开始GC");12 System.gc();13 System.out.println("GC完成");14 //判断当前标准扩展类加载器是否有被引用(是否是unreachable |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |