JVM体系结构
JVM的组成
JVM是模拟一个计算机来达到一个计算机所具有的的计算功能,分为以下几个部分:
- 指令集:能识别的机器语言的命令集合
- 计算单元:能够识别并且控制指令执行的命令集合
- 寻址方式:地址的位数、最小地址和最大地址范围、及地址的运行规则
- 寄存器:操作数、变址、控制等寄存器
- 存储单元:能够存储操作数和保存操作结构的单元。
指令集就是在CPU中用来计算和控制计算机系统的一套指令的集合,每一种新型的CPU在设计时都规定了一系列与其他硬件电路相配合的指令系统。指令集的先进与否也关系到CPU的性能发挥。
主流的体系结构分为精简指令集(RISC)和复杂指令集(CISC)(普遍使用的桌面操作系统)
指令集是可以直接被机器识别的机器码,也就是必须以二进制格式存在于计算机中。
JVM体系结构详解
- 类加载器:JVM启动时是或者类运行时将需要的class加载到JVM中
- 执行引擎:负责执行class文件中包含的字节码指令,相当于实际机器的CPU
- 内存区:将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者PC指针的记录器等。
- 本地方法调用:调用C或C++实现的本地方法的代码返回结果。
JVM工作机制
机器如何执行代码
源代码–>预处理器–>编译器–>汇编程序–>目标代码–>链接器–>可执行程序
JVM为何选择基于栈的架构
- JVM要设计成与平台无关性的,而平台无关性就是要保证在没有或者有很少的寄存器的机器上也要同样能正确的执行Java代码。
- 为了指针的紧凑性,因为Java的字节码可能在网络上传输,所以class文件的大小也是设计JVM字节码指令的一个重要因素,如在class文件中字节码除了处理两个表跳转的指令外,其他都是字节对齐的,操作码可以只占一个字节大小,这都是为了尽量让编译后的class文件更加紧凑。
执行引擎的架构设计
每当创建一个新的线程时,JVM会为这个线程创建一个Java栈,同时会为这个线程分配一个PC寄存器,并且这个PC寄存器会指向这个线程的第一行可执行代码。
JVM方法调用栈
JVM的方法调用分为两种:一种是Java方法调用;另一种是本地方法调用。