快速业务通道

Java虚拟机类型卸载和类型更新解析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
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来观察垃圾收集的情况,对应输出如下:

MyClass 开始GC... [Full GC[Unloading class MyClass] 207K->131K(1984K),0.0126452 secs] 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来观察垃圾收集的情况,对应输出如下:

sun.misc.Launcher$AppClassLoader@197d257 sun.misc.Launcher$AppClassLoader@197d257 sun.misc.Launcher$AppClassLoader@197d257 开始GC... [FullGC196K->131K(1984K),0.0130748 secs] GC完成... sun.misc.Launcher$AppClassLoader@197d257

由于系统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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号