“虚拟机”是一个相对“物理机”的概念,这两种机器都有代码执行能力。

物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的。

虚拟机的执行引擎由自己实现,自行制定指令集与执行引擎的结构体系,并可执行不被硬件直接支持的指令集格式。

在虚拟机规范中,制定了虚拟机字节码执行引擎的概念模型,为各种虚拟机执行引擎的统一外观。

执行引擎在执行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虚拟机:虚拟机字节码执行引擎的更多相关文章

  1. 深入理解Java虚拟机(字节码执行引擎)

    深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力, ...

  2. 深入理解java虚拟机(5)---字节码执行引擎

    字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...

  3. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  4. 《深入理解Java虚拟机》-----第8章 虚拟机字节码执行引擎——Java高级开发必须懂的

    概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念 ,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而 ...

  5. 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎

    五 虚拟机字节码执行引擎   1 运行时栈帧结构     ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素.     ---栈帧中存储了方法的局部变 ...

  6. 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

  7. Java虚拟机--虚拟机字节码执行引擎

    Java虚拟机--虚拟机字节码执行引擎 所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 用于支持虚拟机进行方法调用和方 ...

  8. java虚拟机字节码执行引擎

    定义 java虚拟机字节码执行引擎是jvm最核心的组成部分之一,它做的事情很简单:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.在不同的虚拟机实现里,执行引擎在执行java代码 ...

  9. Java虚拟机-字节码执行引擎

    概述 Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,成为各种虚拟机执行引擎的统一外观(Facade).不同的虚拟机引擎会包含两种执行模式,解释执行和编译执行. 运行时帧栈结构 栈帧(Sta ...

随机推荐

  1. 2016-2017学年第三次测试赛 习题E 林喵喵算术

    时间限制: 1 Sec  内存限制: 128 MB 提交: 70  解决: 25 提交统计讨论版 题目描述 给你两个八进制数,你需要在八进制计数法的情况下计算a-b. 如果结果为负数,你应该使用负号代 ...

  2. leetcode 0205

    目录 700 二叉搜索树中的搜索 175 组合两个表 仍旧不理解 left join 590. N叉树的后序遍历 递归: 迭代: 589 N叉树的前序遍历 递归, 注意 递归 过程中附带的 actio ...

  3. Update(Stage4):sparksql:第5节 SparkSQL_出租车利用率分析案例

    目录: 1. 业务2. 流程分析3. 数据读取5. 数据清洗6. 行政区信息 6.1. 需求介绍 6.2. 工具介绍 6.3. 具体实现7. 会话统计 导读 本项目是 SparkSQL 阶段的练习项目 ...

  4. 设计模式六大原则——开放封闭原则(OCP)

    什么是开闭原则? 定义:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改. 开闭原则主要体现在两个方面: 1.对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况. ...

  5. 查看服务器CPU相关信息!

    # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即 ...

  6. Priority Queue(优先队列)

    今天早上起来完成了一个完整的基于二叉堆实现的优先队列,其中包含最小优先和最大优先队列. 上篇说了优先队列的特性,通过建堆和堆排序操作,我们就已经看到了这种数据结构中的数据具有某种优先级别,要么非根节点 ...

  7. Steam 游戏 《The Vagrant(流浪者)》修改器制作-[先使用CE写,之后有时间的话改用CheatMaker](2020年寒假小目标08)

    日期:2020.02.07 博客期:146 星期五 [温馨提示]: 只是想要修改器的网友,可以直接点击此链接下载: 只是想拿CT文件的网友,可以直接点击此链接下载: 没有博客园账号的网友,可以将页面下 ...

  8. 【协作式原创】查漏补缺之Golang中mutex源码实现

    概览最简单版的mutex(go1.3版本) 预备知识 主要结构体 type Mutex struct { state int32 // 指代mutex锁当前的状态 sema uint32 // 信号量 ...

  9. 多数据库:SQLHelper

    //=============================================================================== // This file is ba ...

  10. javascript ----一些边距知识

    Style top 属性  Style 对象 定义和用法 top 属性设置或返回定位元素的顶部位置. 该属性规定了元素的顶部位置,包括:内边距.滚动条.边框和外边距. 提示:一个定位元素是元素的 po ...