一、Java虚拟机的执行流程
Java虚拟机执行流程分为两大部分:编译时环境和运行时环境,当一个Java文件经过Java编译器编译后会生成class文件,这个class文件会由Java虚拟机来进行处理
Java虚拟机与Java语言没有什么必然的联系,它只与特定的二进制文件:Class文件有关;因此无论任何语言只要能编译成Class文件就可以被Java虚拟机来处理
二、Java虚拟机结构
Java虚拟机结构包括运行时数据区域、执行引擎、本地库接口和本地方法,其中类加载子系统并不属于Java虚拟机的内部结构1
1、Class文件格式
java 文件被编译后生成了Class文件,这种二进制格式的文件不依赖于特定的硬件和操作系统。每一个Class文件中都对应着唯一的类或者接口定义信息,但是类或者接口并不一定定义在文件中,比如类和接口可以通过类加载器来直接生成
2、类的生命周期
一个Java文件被加载到Java虚拟机内存中到从内存中卸载的过程被称为类的生命周期。类的生命周期包括的阶段分别是:加载、链接、初始化、使用和卸载,其中链接包括了三个阶段:验证、准备和解析。各个阶段所做的工作如下:
- 加载:查找并加载class文件
- 链接:包括验证准备和解析
验证:确保被导入类型的正确性
准备:为类的静态字段分配字段,并用默认值初始化这些字段
解析:虚拟机将常量池内的符号引用替换为直接引用 - 初始化:将类变量初始化为正确的初始值
根据《深入理解Java虚拟机》的描述,加载阶段(不是类的加载)主要做了3件事情
- 根据特定名称查找类或接口类型的二进制字节流
- 将这个二进制字节流所代表的静态存储结果转化为方法区的运行时数据结构
- 在内存中生成一个代表这个类的 java.lang.class 对象,作为方法区这个类的各种数据结构的访问入口
3、类加载子系统
类加载子系统通过多种类加载器来查找和加载 Class 文件到 Java 虚拟机中,Java虚拟机有两种类加载器:系统加载器和自定义加载器,其中系统加载器包括以下三种:
- Boots