2. JVM 类加载
JVM 类加载,就是将包内的.class字节码文件加入到JVM管理的内存中,并创建Class对象的过程。
类的加载过程
类加载分为三个过程:加载、链接、初始化,Java采用懒加载的方式,只有主动需求这个类的时候才会触发加载。
加载阶段,会根据类的全限定名查找对应的字节码,并解析其静态结构为创建运行时常量池的框架,然后创建Class对象作为方法区中数据结构的访问入口。
在这个阶段,会遵循双亲委派机制,也就是加载器会委派给父类尝试加载,否则自行进行加载。双亲委派机制可以确保一个同名的类不会被加载多次,间接的确保了核心类的安全,避免被用户自定义加载器污染。双亲委派机制是可以被打破的,主要有以下几种方法:
- 利用线程加载器:每个线程可以设置一个加载器,假设高层的加载器需要动态的加载一个类,并且这个类不在高层的访问范围,那么可以委派给当前线程的加载器,例如DriverLoader并不知道需要加载哪个数据库的驱动,可以委派给ServiceLoader ,调用线程默认的应用加载器,通过SPI机制,搜索到程序中引入的MySQL/Sqlite 等具体数据库驱动包进行加载。
- 重写应用加载器,并用该加载器进行类的加载,可以略过父类加载阶段
- 热加载框架,Java 提供了 java.lang.instrument.Instrumentation 类,允许类加载后RedefineClass, 允许修改一个类,避免加载一个存在的类。
链接阶段,会验证字节码文件格式和内部逻辑是否合法,例如父类是否已经加载,符号引用是否真实,在准备阶段将静态字段初始化为空值/零值,进而解析将常量池中的类、接口、方法、重写等符号引用为真实引用,并校验权限。
初始化阶段,首先对final static字段赋值,进而检查父类是否已经初始化,最后执行

浙公网安备 33010602011771号