【笔记】深入分析JavaWeb技术内幕-(四)JVM体系结构与工作方式

什么是JVM?

JVM(Java Virtual Machine) 通过模拟一个计算机来达到一个计算机所具有的计算功能

指令集:计算机所能识别的机器语言的命令集合

计算单元:能识别并且控制指令执行的功能模块

寻址方式:地址的位数、最小地址和最大地址范围,以及地址的运行规则

寄存器:包括操作数寄存器、变址寄存器、控制寄存器等的定义、数量和使用方式

存储单元:能够存储操作数寄存器和保存操作结构的单元

Java语言的一个非常重要的特点就是与平台的无关性。而使用JVM是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

JVM 基本结构:

1、类加载器:在JVM启动时或者在类运行时将需要的class加载到JVM中

2、执行引擎:负责执行class文件中包含的字节码指令集,相当于cpu

3、内存区:将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块

4、本地方法调用:调用C或者C++实现的本地方法代码返回结果

JVM工作机制

机器如何执行代码

一般程序运行到执行的过程:

源代码——>预处理——>编译器——>汇编程序——>目标代码——>链接器——>可执行程序

基本运算分解为二进制位运算,这些运算又通过指令来完成,而指令的核心目的是确定需要运算的种类(操作码)和运算需要的数据(操作数),以及从哪里来(寄存器或栈)获取操作数、将运算结果放到什么地方(寄存器或栈)

JVM为何选择基于栈的架构

所有操作数必须先入栈,再根据指令中的操作码选择从栈顶弹出若干个元素进行计算后压入栈中。JVM中操作数可以存放在每一个栈顶中的一个本地变量集中,即每个方法调用时就会给这个方法分配一个本地变量集,这个变量集在编译时已经确定,所以操作数入栈可以直接是常量入栈或从本地变量集中取一个变量压入栈中。

理由:

  • 1、跨平台
  • 2、java源文件编译成class文件,编译器一般采用以栈为基础的结构向连接器或者优化器传递这种编译的中间结果,JVM可以作为连接器使用,也可作为优化器使用
  • 3、为了指令集的紧凑性(常量池)
执行引擎的架构设计

每当创建一个新的线程,JVM会为这个线程创建一个Java栈,同时会为这个线程分配一个PC寄存器,并且这个PC寄存器会指向这个线程的第一行可执行代码。每当调用一个新的方法时会在这个栈上创建一个新的栈帧数据结构,以便保留此方法的元信息。

原书链接

以上内容只是个人笔记记录,更多完整内容请购买作者原书籍查看。《深入分析JavaWeb技术内幕》

推荐阅读更多精彩内容