JVM的体系
次访问
需要了解的背景知识
一个计算机体系可以分为哪几个部分?
1.指令集:与计算机硬件直接打交道的机器语言的命令集合。
2.计算单元:识别并控制指令执行的功能模块。
3.寻址方式:地址的位数,最小地址和最大地址范围以及地址的运行规则。
4.寄存器定义:操作数寄存器,变址寄存器,控制寄存器的定义数量和使用方式。
5.存储单元:存储操作数和保存操作结构的单元。
操作数指的是指令执行的参与者,各种操作的对象。
指令集以二进制的方式储存于计算机中,主流的体系结构上分为精简指令集和复杂指令集。x86架构的CPU都使用复杂指令集。
JVM和实体机的关系
1.关于JVM 目前只有一个规范,规定了它有哪些组成部分。
2.具体的实现依赖于不同的厂商的实现方式。
3.JVM运行一个Java程序时,就是一个运行中的实例,每个运行中的Java程序都是一个JVM实例。
JVM的指令集?
JVM作为一个虚拟机,自然也有自己的指令集,称之为JVM字节码指令集。
JVM体系
四部分:
1.类加载器:在JVM启动时或者类运行时将class加载到JVM中。
2.执行引擎:相当于实体机的CPU,负责执行JVM指令集。
3.内存区
4.本地方法调用:调用C或者C++实现的本地方法代码返回结果。
工作机制:
机器怎样执行代码
程序从编译到执行的七个阶段:
source code –preprocessor –compiler —>assembler —>object code—>linker—>executables
不管是何种指令集,最终都会只有基本的元素:加、减、乘、取余、求模。而这几种运算都会分解成位运算:与、或、异或。这些运算又通过指令来完成,指令的核心目的就在于确定运算的种类(操作码)和运算需要的数据(操作数)以及去哪里(寄存器或者栈)获取操作数,将结果存放到什么地方(寄存器或者栈)。
执行引擎的架构
JVM执行字节码指令是基于栈的架构的。所有操作数必须先入栈,然后根据指令中的操作码从栈顶弹出若干个元素进行计算后再将结果压入栈中。
JVM操作数存放在每个栈帧中的一个本地变量集中,在每个方法调用时就会给这个方法分配一个本地变量集,这个变量集在编译时就已经确定了。
基于寄存器的架构:引擎从寄存器取出操作数进行运算之后,然后将结果返回到寄存器中。
看起来好像基于寄存器的架构比较好一点,那为什么JVM要采用基于栈的架构呢?理由有二:一、JVM要设计成为与平台无关的,这就需要考虑平台上没有寄存器或者有很少的寄存器的情况;二,为了指令更加紧凑。但是由于访问内存的速度是一个瓶颈,所以基于栈的结构在理论上来说不如基于寄存器的架构更为快捷。
每当创建一个线程时,JVM会为这个线程创建一个Java栈,同时为这个栈分配一个PC寄存器,这个PC寄存器指向这个线程的第一行可执行代码。而因为每个线程都不只是一个方法,还可能再调用其他方法,每调用一个方法都会产生一个栈帧的数据结构。这个栈帧保留了一下这个方法的元信息,如在这个方法中定义的局部变量,正常方法返回以及异常处理机制等。