目录
JDK、JRE、JVM的关系
JDK(Java Development Kit)是Java的开发工具包,包括JRE(Java Runtime Environment Java运行时环境),JRE包括运行Java程序锁必须的JVM和相关类库API。JVM上可以运行任何符合JVM规范的字节码文件。
.class字节码文件
魔数与
class
文件版本
常量池
访问标志
类索引、父类索引、接口索引
字段表集合
方法表集合
属性表集合
类加载机制
虚拟机把
Class
文件加载到内存
并对数据进行校验,转换解析和初始化
形成可以虚拟机直接使用的
Java
类型,即
java.lang.Class
装载(load)
查找和导入
class
文件
(1)
通过一个类的全限定名获取定义此类的二进制字节流
(2)
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
(3)
在
Java
堆中生成一个代表这个类的
java.lang.Class
对象,作为对方法区中这些数据的访问入口
**Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口**
类装载的方式有哪些?
(
1
)本地系统加载
(
2
)网络下载
.class
文件
(
3
)从
zip
,
jar
等归档文件中加载
.class文件
(
4
)从数据库中提取
.class
文件
(
5
)由
java
源文件动态编译成
.class
文件
(
6
)
Class.forName()
加载
(
7
)
ClassLoader.loadClass()
加载
链接(link)
1.验证(verify)
保证被加载的类的正确性
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
2.准备(prepare)
为类的静态变量分配内存,并将其初始化为默认值
3.解析(resolve)
把类中的符号引用转化为直接引用
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符
7
类符号引用进
行。
符号引用就是一组符号来描述目标,可以是任何字面量。
直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
初始化(initialize)
对类的静态变量,静态代码块执行初始化操作
类加载机制图解
类加载器(ClassLoder)
在装载
(Load)
阶段,其中第
(1)
步
:
通过类的全限定名获取其定义的二进制字节流,需要借助类装载
器完成,顾名思义,就是用来装载
Class
文件的。
(1)
通过一个类的全限定名获取定义此类的二进制字节流
加载原则
检查某个类是否已经加载:顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个Classloader
双亲委派机制
定义:如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把
这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就
成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
优势:
Java
类随着加载它的类加载器一起具备了一种带有优先级的层次关系。比如,
Java
中的
Object
类,它存放在
rt.jar
之中
,
无论哪一个类加载器要加载这个类,最终都是委派给处于模型
最顶端的启动类加载器进行加载,因此
Object
在各种类加载环境中都是同一个类。如果不采用
双亲委派模型,那么由各个类加载器自己取加载的话,那么系统中会存在多种不同的
Object
类。