当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视频教程。