Jvm之类加载机制

首先需要把编写的Java文件编译成class字节码文件,当程序使用到某个类的时候,需要先把这个类加载到内存中。

类加载过程

类加载到使用整个流程有:加载 》》验证 》》准备 》》解析 》》初始化 》》使用 》》卸载
加载: 在硬盘上查找并通过IO读取字节码文件,使用到该类的时候才会被加载。(类加载不是一次性完成的)
验证: 校验字节码的正确性,验证文件格式是否正确、元数据的存储结构验证、字节码的存储结构验证、符号引用的存储结构验证。
准备: 给类的静态变量分配内存,并给变量赋值默认值,比如int类型的赋值为0,String赋值为空字符串,对象赋值为null。
解析: 将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用。
初始化: 对类的静态变量初始化为指定的值,执行静态代码块。

类加载器

上面的类加载过程主要是通过类加载器来实现的,Java里有如下几种类加载器
启动类加载器: 负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、harsets.jar等。
扩展类加载器: 负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中 的JAR类包。
应用程序类加载器: 负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类。
自定义加载器: 负责加载用户自定义路径下的类包。

双亲委派机制

流程

  1. 检查需要使用的类是否已经被加载,如果被加载过就无需加载,如果没有就进行加载。
  2. 先判断一下是否有父加载器,如果没有的话就直接加载,如果有的话,就用父加载器加载。
  3. 如果父加载器没有加载到指定的类的话,就去子加载器加载。

双亲委派的作用
沙箱安全机制: 自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
避免类的重复加载: 当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性

你可能感兴趣的:(JVM)