JVM学习(1)-- 类加载

目录

JDK、JRE、JVM的关系

.class字节码文件

类加载机制

装载(load)

链接(link)

初始化(initialize)

类加载机制图解

类加载器(ClassLoder)

双亲委派机制


JDK、JRE、JVM的关系


JDK(Java Development Kit)是Java的开发工具包,包括JRE(Java Runtime Environment Java运行时环境),JRE包括运行Java程序锁必须的JVM和相关类库API。JVM上可以运行任何符合JVM规范的字节码文件。

JVM学习(1)-- 类加载

.class字节码文件


魔数与class文件版本
常量池
访问标志
类索引、父类索引、接口索引
字段表集合
方法表集合
属性表集合

类加载机制


虚拟机把Class文件加载到内存 并对数据进行校验,转换解析和初始化 形成可以虚拟机直接使用的Java类型,即java.lang.Class
 

装载(load)

查找和导入class文件
(1)通过一个类的全限定名获取定义此类的二进制字节流
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
(3)Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
 
**Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口**
JVM学习(1)-- 类加载JVM学习(1)-- 类加载
类装载的方式有哪些?
1)本地系统加载
2)网络下载.class文件
3)从zipjar等归档文件中加载.class文件
4)从数据库中提取.class文件
5)由java源文件动态编译成.class文件
6Class.forName()加载
7ClassLoader.loadClass()加载

链接(link)

1.验证(verify)

保证被加载的类的正确性

  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证

2.准备(prepare)

为类的静态变量分配内存,并将其初始化为默认值

JVM学习(1)-- 类加载

3.解析(resolve)

把类中的符号引用转化为直接引用

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。
符号引用就是一组符号来描述目标,可以是任何字面量。
直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
 

初始化(initialize)


对类的静态变量,静态代码块执行初始化操作

JVM学习(1)-- 类加载

类加载机制图解

JVM学习(1)-- 类加载

类加载器(ClassLoder)

在装载(Load)阶段,其中第(1):通过类的全限定名获取其定义的二进制字节流,需要借助类装载器完成,顾名思义,就是用来装载Class文件的。
(1)通过一个类的全限定名获取定义此类的二进制字节流

JVM学习(1)-- 类加载

加载原则

检查某个类是否已经加载:顺序是自底向上,从Custom ClassLoaderBootStrap ClassLoader逐层检查,只要某个Classloader

双亲委派机制


定义:如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
 
优势:Java类随着加载它的类加载器一起具备了一种带有优先级的层次关系。比如,Java中的Object类,它存放在rt.jar之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object在各种类加载环境中都是同一个类。如果不采用双亲委派模型,那么由各个类加载器自己取加载的话,那么系统中会存在多种不同的Object类。