Jvm

类的加载机制

Posted by 杨一 on 2020-03-26

类加载机制


类加载的生命周期

加载:把文件字节流转换虚拟机中的变量

验证:验证是否符合虚拟机的要求

准备:类变量(为static修饰的变量)分配内存,设置初始值,是虚拟机的初始值标准,例如int a=0;

解析:常量池中的引用换为实际值。

初始化:执行Java代码,把static有关的代码块执行一遍。

初始化时机:

  • 创建类的实例
  • 访问某个类或接口的静态变量,或者对该静态变量赋值
  • 调用类的静态方法
  • 反射
  • 初始化一个类的子类
  • Java虚拟机启动时被表明为启动类的类
  • 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。

使用:new出实例使用时执行。

卸载:垃圾回收。

加载器

其中在开发Java中能够影响的只有加载这一步骤。

类加载器经常用在:部署时的热替换以及类的加密和解密。

双亲委派模型

为什么有这个双亲委派模型?

保持一个合适的优先级。
比如Object这个类,通过层层加载器,最终都是通过根加载器加载的,保证这个Object类在各个程序中是同一个类,因为决定这个类是不是同唯一类,有两个标准:第一:这个类本身;第二:加载这个类的类加载器。如果一个类由不同的类加载器加载,那么对于虚拟机而言就是两个类。

问题:

倘若A加载器和B加载器各自加载业务类,那么这个业务类到底是继承A加载器中的Object?还是B加载器中的Object? 就会导致Jdk最底层程序无法保证。