类加载过程
系统加载Class类型的文件主要三步:加载➡️连接➡️初始化。其中连接过程有可分为三步:验证➡️准备➡️解析。
加载
- 通过全类名获取定义次类的二进制字节流
- 将字节流所代表的静态存储结构转换为方法去的运行时数据结构
- 在内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口
验证
准备
正式为类变量分配分配内存并设置类变量初始值的阶段
解析
虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。
初始化
真正执行类中定义的java程序代码,初始化是执行类构造器 ()方法的过程。
类加载器
JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader:
- BootstrapClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载 %JAVA_HOME%/lib目录下的jar包和类或者或被 -Xbootclasspath参数指定的路径中的所有类。
- ExtensionClassLoader(扩展类加载器) :主要负责加载目录 %JRE_HOME%/lib/ext 目录下的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。
- AppClassLoader(应用程序类加载器) :面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。