JAVA虚拟机:虚拟机字节码执行引擎
“虚拟机”是一个相对“物理机”的概念,这两种机器都有代码执行能力。
物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的。
虚拟机的执行引擎由自己实现,自行制定指令集与执行引擎的结构体系,并可执行不被硬件直接支持的指令集格式。
在虚拟机规范中,制定了虚拟机字节码执行引擎的概念模型,为各种虚拟机执行引擎的统一外观。
执行引擎在执行java代码时候可能会有解释执行和编译执行两种模式。
输入:字节码 处理:字节码解析 输出:执行结果
虚拟机的方法调用
虚拟机的字节码执行
栈幀:存在于虚拟机栈内存中,用于支持虚拟机进行方法调用和方法执行的数据结构。为虚拟机栈中的栈元素。
存储数据:局部变量表、操作数栈、动态链接和方法返回地址。
方法调用过程即一个栈幀在虚拟机栈里从入栈到出栈的过程。
局部变量表的大小、操作数栈深度,在编译期间已经确定,这些大小、深度写入了方法表的Code属性中,因此一个栈幀需要分配多少内存,不会受到程序运行
期间变量数据的影响,而仅仅取决于具体的虚拟机实现。
一个线程中的方法调用链很长,很多方法都同时处于执行状态,对于执行引擎来说,在活动线程中,只有位于栈顶的栈幀才是有效的,称为当前栈幀,与这个栈幀相关的方法称为当前方法。
执行引擎的所有字节码指令都只针对当前栈幀进行操作。
栈幀概念模型: 当前线程 线程1 线程2
当前栈幀 当前栈幀 当前栈幀
局部变量表 局部变量表 局部变量表
操作数栈 操作数栈 操作数栈
动态链接 动态链接 动态链接
方法返回地址 方法返回地址 方法返回地址
............. ............. .............
栈幀N 栈幀N 栈幀N
............ ............ ............
栈幀2 栈幀2 栈幀2
栈幀1 栈幀1 栈幀1
局部变量表:存放方法参数和方法内部局部变量,容量:在java程序编译为class文件时,就在方法的code属性的max_locals数据项中确定了该方法的所需分配的局部变量表的最大容量。
变量槽(Slot)是局部变量表中最小单位。
操作数栈:后入先出栈,可用户算术运算或调用其他方法时候进行参数传递。
例子:整数加法的字节码指令iadd在运行时候操作数栈中最接近栈顶的两个元素已经存入两个int型的数值,当执行这个指令时,会将这两个int值出栈并相加,然后将相加后的结果入栈。
动态链接:
方法返回地址:即当前栈幀出栈,退出时执行操作:恢复上层方法的局部变量表和操作数栈,把返回值压入调用者栈幀的操作数栈中,调整计数器的值指向后一条指令。
方法调用过程:
方法调用概念:确定被调用方法的版本
解析:所有方法调用中的目标方法在class文件里都有一个常量池中的符号引用,在类记载的解析阶段,会将其中的一部分符号引用转化为直接引用,这种解析能成立的前提是:方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不可改变的。比如:静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自的特点决定了他们都不可能通过继承或别的方式重写其他版本,因为他们都适合在类加载阶段进行解析。
java虚拟机5条方法调用字节码指令:
1、invokestatic :调用静态方法。
2、invokespecial:调用实例构造方法、私有方法、父类方法。
3、invokevirtual:调用所有的虚方法。
4、invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象。
5、invokedynamic:先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法,以上4条指令,分派逻辑是固化在java虚拟机内部的,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。
JAVA虚拟机:虚拟机字节码执行引擎的更多相关文章
- 深入理解Java虚拟机(字节码执行引擎)
深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力, ...
- 深入理解java虚拟机(5)---字节码执行引擎
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- 《深入理解Java虚拟机》-----第8章 虚拟机字节码执行引擎——Java高级开发必须懂的
概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念 ,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而 ...
- 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎
五 虚拟机字节码执行引擎 1 运行时栈帧结构 ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素. ---栈帧中存储了方法的局部变 ...
- 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...
- Java虚拟机--虚拟机字节码执行引擎
Java虚拟机--虚拟机字节码执行引擎 所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 用于支持虚拟机进行方法调用和方 ...
- java虚拟机字节码执行引擎
定义 java虚拟机字节码执行引擎是jvm最核心的组成部分之一,它做的事情很简单:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.在不同的虚拟机实现里,执行引擎在执行java代码 ...
- Java虚拟机-字节码执行引擎
概述 Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,成为各种虚拟机执行引擎的统一外观(Facade).不同的虚拟机引擎会包含两种执行模式,解释执行和编译执行. 运行时帧栈结构 栈帧(Sta ...
随机推荐
- element table批量删除
很小的一个问题,但是有细节需要注意 (1)问题:在起初我写的时候是根据元素的name是否相同判断是否是同一个节点,出现的问题就是,如果说两个元素的name相同,就会判断出错 (2)代码: <te ...
- leetCode练题——26. Remove Duplicates from Sorted Array
1.题目 26. Remove Duplicates from Sorted Array--Easy Given a sorted array nums, remove the duplicates ...
- Python爬虫连载6-cookie深入使用实例化实现自动登录
一.使用cookie登录 1.直接把cookie复制下去,然后手动放到请求头 2.http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie (1)cookieJar 管理存储c ...
- Flask - 底层原理和基本流程
一. flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi 1. werkzeug示例 from werkzeug.wrappers ...
- Matlab的简单数据保存读取
1.使用load进行文件读取 例如读入文件名为'filename.txt'中的数据,那么可以使用以下代码: load('filename.txt') 注意:filename.txt中的数据应符合矩阵形 ...
- broadcom sdk command
1.查看端口link状态 BCM.0>ps 2.查看vlan BCM.0>vlan show 3.查看pvlan BCM.0>pvlan show 4.CPU发包 BCM.0> ...
- ubuntu13.10安装增强功能
步骤: 1>cd /mnt 2> ./VBoxLinuxAdditions.run 3>设置共享文件夹share 4>访问共享文件夹cd /media/sf_share not ...
- 12 JavaScript String对象 & Date对象
<script> var a = "string"; var b = new String("string"); var c = new Strin ...
- MySql向SQLServer迁移常见问题
-- MySql与SQLServer update inner join语法区别-- MySql: UPDATE A LEFT JOIN B ON A.B_ID = B.B_ID SET A.A_NA ...
- C语言入门---第九章 C语言指针
没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...