JVM类加载机制
一个类从加载到使用一般会经历的过程
加载 —— 验证—— 准备 —— 解析 —— 初始化 —— 使用 —— 卸载
验证:验证.class文件是否合乎jvm规范
准备:为加载类分配一定的内存空间,包括类变量分配内存空间并且赋默认初始值
解析:将符号引用替换为直接引用
初始化:准备阶段只会赋初始值,如果是有执行代码会在初始化时执行并赋值,执行静态代码块中的方法
JVM在什么情况下会去加载一个类
当代码中需要使用这个类时
什么时候会初始化一个类
一般来说会在new实例化对象时和包含main()方法的主类时,并且会加载和初始化这个类继承的父类
类加载器的双亲委派机制
-
启动类加载器
Bootstrap ClassLoader主要负责加载java目录中的核心类,一旦jvm启动就首先会依托启动类加载器去加载lib目录下的核心类库
-
扩展类加载器
Extension ClassLoader会在jvm启动时去加载lib\ext目录中类
-
应用程序类加载器
Application ClassLoader负责加载ClassPath环境变量所指定的路径中的类,大致理解为加载自己写好的java代码到内存中
-
自定义类加载器
根据自己的需求加载类
双亲委派机制
应用程序类加载器首先会委派给扩展类加载器,扩展类加载器委派给启动类加载器,启动类加载器找不到让扩展类加载器自己去找,扩展类加载器找不到让应用程序类加载器自己加载,此时应用程序类加载器加载到了这个类