导图链接:https://www.processon.com/view/link/63d146844e30670eac4accb9
一、类加载子系统
![](https://i-blog.csdnimg.cn/blog_migrate/7c797b937a8a69cf07865fd78d3f69ad.png)
从磁盘或者网络中加载class文件到运行时数据区的方法区中。
二、运行时数据区
![](https://i-blog.csdnimg.cn/blog_migrate/ea8a76937bee5f6d254dae9823982ed7.png)
线程私有
虚拟机栈
由一个个栈帧组成,一个方法就是一个栈帧。
局部变量表
存放方法中的局部变量,类似数组结构。
操作数栈
栈结构,存放变量的值。值参与完计算后就会出栈。
动态链接
程序运行期间符号引用转化为直接引用。
方法出口
方法返回地址
本地方法栈
native修饰的方法
程序计数器
可以理解为字节码指令的行号(内存地址指针)
执行引擎:方法执行过程中,每执行完一条指令后,更新程序计数器为下一条需要被执行的指令地址。
线程共享
堆
几乎所有new出来的东西 + 常量池
方法区
常量、静态变量以及类元信息。占用(分配)的是物理机内存。
关联关系
栈 ===>堆
局部变量指向的是对象时,存放的是堆中该对象实例的内存地址值。
执行引擎:方法执行过程中,可能通过存储在局部变量表中的对象引用准确定位到堆中的对象实例信息。
方法区 ===> 堆
静态变量指向的是对象时,存放的是堆中该对象实例的内存地址值。
堆 ===> 方法区
执行引擎:方法执行过程中,可能需要对象头中的Klass指针定位到目标对象的类元信息。
三、字节码执行引擎
![](https://i-blog.csdnimg.cn/blog_migrate/f4a5cc807a76cedba397634b33382313.png)
类加载子系统将字节码装载到运行时数据区后,字节码并不能够直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被jvm识别的字节码指令、符号表以及其它赋值信息。
字节码执行引擎的任务就是将字节码指令解释(编译)为对应平台上的本地机器指令。简单来说,其充当了将高级语言翻译为机器语言的译者。