JVM - 类的加载机制
什么是类的加载
类的加载指将类的.class文件二进制数据读入到内存中,将其放在运行时的方法区内,然后在堆内存创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。Class对象封装了类在方法区内的数据结构,并提供了各种访问接口。
类的加载过程
加载 --> 验证 --> 准备 --> 解析 --> 初始化 --> 使用 --> 卸载
- 加载:通过类加载器加载class文件,并在堆内存创建Class对象;
- 验证:验证文件格式、元数据、字节码和符号引用等是否符合JAVA规范,否则报错;
- 准备:初始化类的静态变量和默认值;
- 解析:将常量池内的符号引用替换为直接引用;
- 初始化:将类中静态变量赋予初始值;
- 使用:new出对象并使用;
- 卸载:执行垃圾回收。
类加载器
- 启动类加载器:主要负责加载jre/lib目录下的类库;
- 扩展类加载器:主要负责加载jre/lib/ext目录或者java.ext.dirs系统变量指定的目录下的类库;
- 应用程序类加载器:主要负责加载classpath指定的目录下类库
类加载机制
- 双亲委派:先让父类加载尝试加载类,父类加载器无法加载时才有当前类加载器进行加载;
- 全面负责:一个类加载器加载某个class时,该class依赖的其他类也有该类加载器负责加载;
- 缓存机制:所有加载过的class类都会被缓存,类加载器会先从缓存区查询,查询不到时才去加载。
类加载方式
- 命令行启动应用时候由JVM初始化加载
- 通过Class.forName()方法动态加载
- 通过ClassLoader.loadClass()方法动态加载
Class.forName()和ClassLoader.loadClass()区别
- Class.forName():将类的.class文件加载到jvm中,还会对类进行解释,执行类中的static块;
- ClassLoader.loadClass():将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
- Class.forName(name,initialize,loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。
网友评论