1 JVM体系结构图
JVM主要由类加载系统、运行时数据区、执行引擎、本地方法接口等组成。
2 类加载器
类加载器主要负责将编译好的class文件加载到内存中(方法区),使JVM可以实例化使用加载过后的类。
类加载器分为加载、链接(验证、准备、解析)、初始化三步。
- 加载:通过类的全限定名和ClassLoader加载类,主要是将指定的.class文件加载至JVM。当类被加载以后,在JVM内部就以“类的全限定名+ClassLoader实例ID”来标明类。在内存中,ClassLoader实例和类的实例都位于堆中,它们的类信息都位于方法区。
- 验证:校验class文件的正确性
- 准备:为类分配内存并初始化静态变量
- 解析:将符号引用解析成直接引用
- 初始化:初始化类的静态变量并执行static代码和构造函数
3 运行时数据区
虚拟机将所管理的内存划分成多个区域,其中方法区和堆是线程共享,Java栈、本地方法栈、程序计数器是线程私有。
- 方法区:存储类信息、常量、静态变量、即时编译器编译后的代码等数据
- 堆:存储Java对象
- Java栈:主要存放局部变量表、操作数栈、帧数据
- 程序计数器:当前线程所执行的字节码的行号指示器
- 本地方法栈:与Java栈类似,存储本地方法调用的状态
4 执行引擎
执行引擎主要负责Java字节码的执行,执行的方式分为:
- 解释执行
- 编译执行
- 自适应优化执行