1,类加载机制
一个类从加载到使用到卸载一共经过了5个步骤:
加载 -> 连接 -> 初始化
其中连接分为验证,准备,解析三个阶段
1,加载
那么什么时候会将.class文件加载到jvm中?
就是在你使用这个类的时候。
验证,准备,解析
2,验证
验证是对class文件进行校验,判断它是否符合指定的规范,不然你把.class文件丢给JVM,结果JVM根本不认识就很离谱。
3,准备
类变量(成员变量),静态变量分配内存空间,并且设置默认值,数值类型就是0,布尔类型就是false,其他引用类型就是null
4,解析
把符号引用替换为直接引用。
这个我是这么理解的,符号引用就是 int num=0,这个num(变量名)就是符号引用,那么jvm会将这个num解析成指向内存中这个变量的指针,这个指针就是直接引用;
这里只是拿类变量打个比方,他还会将方法
5,初始化
初始化就是将之前分配了默认值的变量,设置变量值。
2,双亲委派机制
类加载是通过加载器来实现的,那么有哪几种加载器呢?
(1)启动类加载器
Bootstrap ClassLoader,加载jdk中lib目录下的核心类;
(2)类扩展加载器
Extension ClassLoader,加载jdk中lib/ext目录的类;
(3)应用程序加载器
Application ClassLoader,加载自己写的class类;
(4)自定义加载器
自己实现,根据自己的需求自定义加载类;
(5)双亲委派机制
jvm的类加载器是有亲子结构的,会先从上到下查找需要加载的类,如果在上面找到了,那么会用父加载器来完成加载,如果父类没找到会去子类加载器接着找,知道最后,如果都没有就会报错:ClassNotFoundException
这就是所谓的双亲委派模型:先找父亲去加载,不行的话再由儿子来加载。
这样的话,可以避免多层级的加载器结构重复加载某些类。