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

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

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

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

执行引擎在执行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虚拟机:虚拟机字节码执行引擎相关推荐

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

    代码编译的结果就是从本地机器码转变为字节码.我们都知道,编译器将Java源代码转换成字节码?那么字节码是如何被执行的呢?这就涉及到了JVM字节码执行引擎,执行引擎负责具体的代码调用及执行过程.就目前而 ...

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

    文章目录 8.3 方法调用 8.3.1 解析 8.3.2 分派 8.3.3 动态类型语言支持 8.4 基于栈的字节码解释执行引擎 8.4.1 解释执行 8.4.2 基于栈的指令集与基于寄存器的指令集 ...

  3. 虚拟机字节码执行引擎

    1 概述 执行引擎是Java虚拟机核心的组成部分之一."虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处 ...

  4. 【Java 虚拟机原理】Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 )

    文章目录 一.字节码文件 与 JVM 二.字节码文件示例 三.字节码文件二进制结构分析 1.魔数 2.次版本号 3.主版本号 4.常量池个数 一.字节码文件 与 JVM Java 源码编译成 Clas ...

  5. 《深入理解Java虚拟机》笔记5——类加载机制与字节码执行引擎

    第七章 虚拟机类加载机制 7.1 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在J ...

  6. java虚拟机调用linux_Java虚拟机字节码执行引擎

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

  7. JAVA 虚拟机类加载机制和字节码执行引擎

    引言 我们知道java代码编译后生成的是字节码,那虚拟机是如何加载这些class字节码文件的呢?加载之后又是如何进行方法调用的呢? 一 类文件结构 无关性基石 java有一个口号叫做一次编写,到处运行 ...

  8. 深入理解Java虚拟机(周志明第三版)- 第八章:虚拟机字节码执行引擎

    系列文章目录 第一章: 走近Java 第二章: Java内存区域与内存溢出异常 第三章: Java垃圾收集器与内存分配策略 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言 ...

  9. 深入理解java虚拟机-第五章:虚拟机字节码执行引擎

    本章将介绍虚拟机如何调用方法 一.java虚拟机字节码执行引擎 执行引擎在执行代码的时候可能有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种. 执行流程:输入的是字节码文件 ...

最新文章

  1. python目前的应用领域_专栏G|轻松学Python01:Python环境搭建与运行
  2. 55、组播配置实验之PIM Sparse Mode静态指定RP
  3. 14.Python抠图脚本
  4. python 使用全局变量_如何在Python中的不同模块中使用全局变量
  5. Flask框架从入门到精通之路由(三)
  6. 60 分钟极速入门 PyTorch
  7. 1959: 图案打印
  8. Mysql学习总结(28)——MySQL建表规范与常见问题
  9. Win10安装MySQL5.7(图文详解)
  10. 17082 两个有序数序列中找第k小
  11. 基于guava的重试组件Guava-Retryer
  12. qt制作一个简易的听小说工具
  13. 产业园区数字孪生规划方案
  14. 谷歌云服务器账号,免费使用谷歌云服务器一年
  15. Codeforces::GYM 102896E Easy Measurements
  16. Odoo 8.0深入浅出开发教程
  17. 自监督学习论文、代码汇总
  18. BZOJ3837: [Pa2013]Filary
  19. hotmail邮箱在Outlooknbsp;2010中…
  20. 点击获取验证码并登录的实现和验证原理

热门文章

  1. php: eclipse 编辑 php
  2. linux基础知识——exec函数
  3. Leetcode--714. 买卖股票的最佳时间含手续费
  4. php 文件指定位置添加内容,C++_VC++在TXT文件指定位置追加内容的方法,本文实例讲述了VC++操作文本文 - phpStudy...
  5. Matlab画图技巧之保存超大体积图
  6. cad快捷键文件路径_办公格式转太难不会看这里!CAD、PDF、Word、Excel、TXT教你玩转...
  7. python编程入门单例_python实现单例模式怎么写啊?
  8. 主成分分析PCA以及特征值和特征向量的意义
  9. 利用tensorflow构建AlexNet模型,实现小数量级的猫狗分类(只有train)
  10. Java加密与解密的艺术~DES实现