2、类加载子系统
2.1 内存结构概述
注:class loader扮演一个快递员角色,.class->JVM->成为元数据模板
2.2 加载过程
类的加载过程
1、通过一个类的全限定名获取定义此类的二进制字节流
2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
链接阶段
初始化阶段
2.3 类加载器分类
2.4 双亲委派机制
双亲
- 父类加载器(parent classloader):它可以替子加载器尝试加载类
- 引导类加载器(bootstrap classloader): 子类加载器只能判断某个类是否被引导类加载器加载过,而不能委托它加载某个类;换句话说,就是子类加载器不能接触到引导类加载器,引导类加载器对其他类加载器而言是透明的。
判断是否是同一个类:
在JVM中表示两个class对象是否是同一个类存在两个必要条件:
类的完整类名必须一致,包括包名。
加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。
换句话说,在JVM中,及时这两个类对象来源于同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。
只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。**
JVM必须知道一个类型是由启动加载器加载的还是用户类加载器加载的。若果一个类是由用户类加载器加载的,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区中。