JVM类加载器

80 阅读2分钟

类的加载

加载过程主要完成三件事情:

  • 加载:

    • 通过类的全限定名来定位获取物理存储中的此类并转换为二进制字节流
  • 链接:

    • 验证:目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。

    • 准备:为类变量分配内存并且为该类变量进行默认初始化,这里不包含用final修饰的static,因为final在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。

    • 解析:主要将常量池中的符号引用替换为直接引用的过程。

  • 初始化:

    • 类加载最后阶段,若该类具有父类类,则对其父类优先初始化,static变量将会在这个阶段显示初始化,成员变量也将被默认初始化。

加载过程是由类的加载器完成。

类的加载器分为: 引导类加载器、扩展类加载器、系统类加载器、用户自定义类的加载器

引导类加载器

  • 1.用来加载java的核心类库
  • 2.由C语言编写。
  • 3.用于加载扩展类加载器和应用程序类加载器
  • 4.只加载包名为java,javax,sun开头的类

扩展类加载器

  • 1.由java编写,继承自ClassLoader类。
  • 2.从java.ext.dirs指定的路径下加载类库;或者从JDK安装目录的jre/lib/ext目录下加载类库。

系统类加载器

  • 1.由java编写,继承自ClassLoader类。
  • 2.用于加载扩展类加载器和应用程序类加载器
  • 3.用于加载用户自定义的类

双亲委派机制

目的

防止核心类库受到恶意篡改。

file

简单来说,就是从系统类加载器依次向上查询是否能够加载该类如果父类可以加载该类那么就由父类加载器加载,否则就由下级加载。 这样就可以防止核心类库受到篡改,并且不同加载器加载的同名类属于不同的类型,不能相互转化和兼容。