JVM - 类加载机制

本文内容主要来源于《分布式java应用与基础实践》

类加载机制

类加载机制是指.class文件加载到jvm生成class对象,然后在代码中可以实例化class对象并进行调用。类加载机制不仅可以加载本地的.class还可以运行时动态加载.class ,并且通过类加载机制达到类隔离的效果。比如tomcat中可以部署多个war包就是通过类隔离机制来实现的。
整个类加载过程分为三个步骤:

  • 加载
  • 链接
  • 初始化
    当加载和链接过程完成后,.class文件就从二进制文件转化为了Class对象 ,但是初始化不一定发生在类加载过程中,但是最迟发生在初次主动使用对象前。
JVM - 类加载机制_第1张图片
Paste_Image.png

装载

装载过程负责将二进制字节码加载到jvm中,通过类的全限定名和类加载器完成类的加载,并且使用类的全限定名和类加载器实例id来标识被加载的类:com.test.Demo+ClassLoader实例id。类的命名规范如下:

  • 对于接口或非数组类型的类,其名称即为类名
  • 对于数组类型的类,其名称为“[+基本类型或L+引用类型类名;“,数组类型中的元素类型由所在的classLoader负责加载,但是数组类型本身则由jvm直接创建。

链接

该过程主要是对二进制字节码进行校验,初始化静态变量以及设置默认值,解析类调用的接口和类,对类中属性和方法进行验证。

初始化

初始化过程包括:执行静态代码块,构造器,静态属性的初始化。在以下四中情况下会进行初始化操作:

  • new一个对象。
  • 反射调用了类中的方法。
  • 子类初始化
  • jvm启动过程指定的初始化类。

类加载机制

从JDK1.2版本开始引入如下图所示的双亲委派模型。什么叫双亲委派模型:除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。具体工作过程:如果一个类加载器收到类加载请求,它首先会将请求动作委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传递到顶层的启动类加载器中,只有当父类加载器反馈自己无法加载请求时(在它的搜索范围内没有找到所需的类),子加载器才会尝试自己去加载。

JVM - 类加载机制_第2张图片
Paste_Image.png
  • BootStrap ClassLoader
    此类是由C++实现的,属于虚拟机自身的一部分。这个类不是ClassLoader的子类,在运行时没办法拿到这个对象,jvm启动时会初始化此类,并且通过此ClassLoader完成$JAVA_HOME中的jre/lib/rt.jar里面所有的class文件。

  • Extension ClassLoader
    jvm用此ClassLoader来加载一些拓展的jar包,对应的类名为:ExtClassLoader。

  • System ClassLoader
    jvm用此ClassLoader来加载启动时指定的Classpath中的jar包,对应的类名为:AppClassLoader。

  • User-defined ClassLoader
    开发人员集成ClassLoader抽象类自行实现类加载器。可以在类加载时自定义操作,比如从网络下载jar包,解密等等。

你可能感兴趣的:(JVM - 类加载机制)