Java虚拟机JVM学习07 类的卸载机制

 

Java虚拟机JVM学习07 类的卸载机制

 

类的生命周期

  当Sample类被加载、链接和初始化后,它的生命周期就开始了。学习

  当表明Sample类的Class对象再也不被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。spa

  因而可知,一个类什么时候结束生命周期,取决于表明它的Class对象什么时候结束生命周期3d

 

引用关系

  加载器和Class对象:视频

  在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。对象

  另外一方面,一个Class对象老是会引用它的类加载器。调用Class对象的getClassLoader()方法,就能得到它的类加载器。blog

  因而可知,Class实例和加载它的加载器之间为双向关联关系教程

 

  类、类的Class对象、类的实例对象:生命周期

  一个类的实例老是引用表明这个类的Class对象。get

  在Object类中定义了getClass()方法,这个方法返回表明对象所属类的Class对象的引用。虚拟机

  此外,全部的Java类都有一个静态属性class,它引用表明这个类的Class对象。

 

类的卸载

  由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。

  前面介绍过,Java虚拟机自带的类加载器包括根类加载器扩展类加载器系统类加载器

  Java虚拟机自己会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象,所以这些Class对象始终是可触及的

 

  由用户自定义的类加载器加载的类是能够被卸载的。

 

具体例子

 

 

  loader1变量和obj变量间接应用表明Sample类的Class对象,而objClass变量则直接引用它。

 

  若是程序运行过程当中,将上图左侧三个引用变量都置为null,此时Sample对象结束生命周期,MyClassLoader对象结束生命周期,表明Sample类的Class对象也结束生命周期,Sample类在方法区内的二进制数据被卸载

 

  当再次有须要时,会检查Sample类的Class对象是否存在,若是存在会直接使用,再也不从新加载;若是不存在Sample类会被从新加载,在Java虚拟机的堆区会生成一个新的表明Sample类的Class实例(能够经过哈希码查看是不是同一个实例)。

 

参考资料

  圣思园张龙老师Java SE视频教程。

相关文章
相关标签/搜索