JVM类加载机制

一个类从加载到使用一般会经历的过程

加载 —— 验证—— 准备 —— 解析 —— 初始化 —— 使用 —— 卸载

验证:验证.class文件是否合乎jvm规范

准备:为加载类分配一定的内存空间,包括类变量分配内存空间并且赋默认初始值

解析:将符号引用替换为直接引用

初始化:准备阶段只会赋初始值,如果是有执行代码会在初始化时执行并赋值,执行静态代码块中的方法

JVM在什么情况下会去加载一个类

当代码中需要使用这个类时

什么时候会初始化一个类

一般来说会在new实例化对象时和包含main()方法的主类时,并且会加载和初始化这个类继承的父类

类加载器的双亲委派机制

  • 启动类加载器

    Bootstrap ClassLoader主要负责加载java目录中的核心类,一旦jvm启动就首先会依托启动类加载器去加载lib目录下的核心类库

  • 扩展类加载器

    Extension ClassLoader会在jvm启动时去加载lib\ext目录中类

  • 应用程序类加载器

    Application ClassLoader负责加载ClassPath环境变量所指定的路径中的类,大致理解为加载自己写好的java代码到内存中

  • 自定义类加载器

    根据自己的需求加载类

双亲委派机制

​ 应用程序类加载器首先会委派给扩展类加载器,扩展类加载器委派给启动类加载器,启动类加载器找不到让扩展类加载器自己去找,扩展类加载器找不到让应用程序类加载器自己加载,此时应用程序类加载器加载到了这个类

双亲委派机制