Class文件二进制字符流通过类加载器和虚拟机加载到内存(方法区)完成在内存上的布局和初始化后,虚拟机字节码执行引擎就可以执行相关代码实现程序所定义的功能。虚拟机执行引擎执行的对象是方法(均特指非本地方法),方法是

着一个程序所定义的一个功能的载体,实现预定的业务功能或者特定的功能等。虚拟机执行引擎就是执行程序方法的一个引擎,一个类的信息通过方法承载了它所担负的功能职责,程序的执行就是一个个方法的执行和相互调用。

方法的内容有:方法名,参数列表,返回值,内部定义的局部变量,方法的可见性,方法内部的执行操作和符号引用等等。虚拟机执行引擎要执行方法,首先就需要用单独的数据结构来存放定义方法签名信息和内部定义的局部变量等。然后

方法内部引用到了外部类或者方法等信息就需要进行相关符号引用的解析,而且在允许方法出现重载的情况下还要特定的机制用来确定最终要执行的方法版本。最后还要告诉底层硬件将要如何执行预定的程序代码。

Java虚拟机内存内针对方法的执行专门划分了一个区域即虚拟机栈。虚拟机栈内通过栈帧结构来存储调用方法和执行方法需要的局部变量,操作数栈、方法返回值等,通过栈帧的出入栈来表示方法的执行顺序。

1、栈帧结构:虚拟机内如何存储方法的内容,方法如何在虚拟机内的表示

栈帧的结构也就是程序方法的结构,栈帧结构存储了方法的内容。栈帧的出栈入栈代表了方法的执行过程和方法执行模型。

栈帧组成

用途、作用、功能

特点

其他

局部变量表 变量值存储空间,用于存放方法需要的参数和局部变量 以变量槽Slot为最小单位,每个Slot存储特定类型的数据信息,且可重用
局部变量表内的变量在虚拟机类的加载过程中不进行系统默认值初始化。
静态方法:
实例方法:第0位索引存放方法所属对象实例的引用
操作栈 用于存放字节码操作指令执行所需要的操作数值和操作执行结果值 32位数据占用1个操作栈,64位数据占用两个操作栈  
动态连接 运行期将相关的符号引用转换为直接引用 静态连接:在类加载或者第一次使用的时候转换为直接引用 栈帧信息
返回地址 方法执行完成的结果值   栈帧信息
附加信息 附加到栈帧上的一些信息   栈帧信息

2、方法的调用:解析方法的符号引用和确定方法的版本

(1)虚方法和非虚方法

只有在允许方法重载的情况下才有虚方法和非虚方法之分,因为在允许重载的情况下方法的版本不止一个,在方法的执行前需要特定的机制确定将要执行的方法版本。

非虚方法:能够在解析阶段(将符号引用转换为直接引用)确定方法执行版本的方法。在解析阶段能够确定方法版本的有:静态方法,私有方法,实例构造器,父类方法,final修饰的方法

虚方法:只有在运行期才能够最终确定方法执行版本的方法。

(2)解析

方法调用时,方法执行前将方法内的符号引用转换为直接引用的过程

解析调用时一个静态的过程,在编译期内就能够完全确定。类加载过程中解析阶段就会把涉及的符号引用直接转换为直接引用。

(3)分派

确定方法最终调用的版本的步骤。

1)静态分派和动态分派:

静态分派(编译期分派):在编译期根据静态类型来定位方法执行的版本的分配过程,因为静态类型在编译期可知.Java虚拟机方法重载的规则就是根据参数的静态类型确定最终执行的方法版本的。

动态分派(运行期分派):在运行期根据实际类型来确定最终执行的方法版本的分派过程

2)方法的重载和重写

3、虚拟机如何执行方法?虚拟机执行引擎的工作机制

(1)解释执行(通过解释器执行)

指令集

优点

缺点

应用情况

基于栈的指令集 可移植,代码相对紧凑、编译器实现简单 执行速度慢  
基于寄存器的指令集 受硬件约束大,不可移植性 执行速度快 主流物理机采用

(2)编译执行(通过JIT编译器产生本地代码执行)

重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?程序方法如何被执行?虚拟机执行引擎的工作机制的更多相关文章

  1. JVM总结-虚拟机怎么执行字节码

    1. JRE,JDK JRE : 包含运行 Java 程序的必需组件,Java 虚拟机+ Java 核心类库等. JDK :  JRE + 一系列开发.诊断工具. 2. java字节码 编译器将 Ja ...

  2. 深入理解Java AIO(二)—— AIO源码解析

    深入理解Java AIO(二)—— AIO源码解析 这篇只是个占位符,占个位置,之后再详细写(这个之后可能是永远) 所以这里只简单说一下我看了个大概的实现原理,具体的等我之后更新(可能不会更新了) 当 ...

  3. Java安全之动态加载字节码

    Java字节码 简单说,Java字节码就是.class后缀的文件,里面存放Java虚拟机执行的指令. 由于Java是一门跨平台的编译型语言,所以可以适用于不同平台,不同CPU的计算机,开发者只需要将自 ...

  4. JVM总结(五):JVM字节码执行引擎

    JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 ...

  5. 【JDK命令行 一】手动编译Java源码与执行字节码命令合集(含外部依赖引用)

    写作目标 记录常见的使用javac手动编译Java源码和java手动执行字节码的命令,一方面用于应对 Maven 和 Gradle 暂时无法使用的情况,临时生成class文件(使用自己的jar包):另 ...

  6. 《深入理解Java虚拟机》学习笔记之字节码执行引擎

    Java虚拟机的执行引擎不管是解释执行还是编译执行,根据概念模型都具有统一的外观:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 栈帧(Stack Frame) ...

  7. 8.5(java学习笔记)8.5 字节码操作(javassist)

    一.javassist javassist让我们操作字节码更加简单,它是一个类库,允许我们修改字节码.它允许java程序动态的创建.修改类. javassist提供了两个层次的API,基于源码级别的和 ...

  8. 记一次使用修改字节码的方法解决java.lang.NoSuchMethodError

    接兔兔国际sdk ane 充值界面选择兔币充值就会闪退, 观察logcat 04-19 10:10:54.224: E/AndroidRuntime(20315): FATAL EXCEPTION: ...

  9. Java Eclipse编译后产生的字节码文件,用DOS命令符怎么打开

    在很多初学者刚刚接触eclipse的时候,写完一个代码文件.例如 Demo.java 通过run as a java application生成之后,会产生一个Demo.class. Demo.cla ...

随机推荐

  1. mysql解决大量time_wait

    mysql解决大量time_wait     命令查看TIME_WAIT连接数 netstat -ae|grep "TIME_WAIT" |wc -l 早上登陆服务器的时候输入ne ...

  2. Android Things:撸起袖子来创建第一个Things工程

    http://blog.csdn.net/p106786860/article/details/60161020 ——————————————————————————————————————————— ...

  3. 模板, 保存&发布

    单击“视图”菜单中的“幻灯片模板”按钮,会弹出“幻灯片母版”选项卡,在此选项卡中,可以修改当前PPT的模板, 例如网上下载的幻灯片上的LOGO都可在这里去除. 模板设计总结 1. 背景可以选择纯色,也 ...

  4. ubuntu中文件夹的作用

    /bin系統有很多放置執行檔的目錄,但/bin比較特殊.因為/bin放置的是在單人維護模式下還能夠被操作的指令. 在/bin底下的指令可以被root與一般帳號所使用,主要有:cat, chmod, c ...

  5. Spark学习笔记——构建分类模型

    Spark中常见的三种分类模型:线性模型.决策树和朴素贝叶斯模型. 线性模型,简单而且相对容易扩展到非常大的数据集:线性模型又可以分成:1.逻辑回归:2.线性支持向量机 决策树是一个强大的非线性技术, ...

  6. python 切片获取list、tuple中的元素

    #-*- coding:UTF-8 -*- L=[] n=6 r=[1,2,3,4,5,6] for i in range(n): L.append(r[i]) print L # =>[1, ...

  7. [Node.js] 04 - Event and Callback

    回调函数 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数. 异步读取文件的回调函数: var fs = require("fs&quo ...

  8. MySql安全模式的关闭和开启

    #MySql关闭安全模式 ; commit; #MySql开启安全模式 ; commit;

  9. 前端模板学习bootstrap

    前端最主要的工作是布局,呈现数据,这与后台处理数据的工作迥然不同,所以要多看别人写的好的模板.但是别人用到的css,js文件和我们的都不太相同,所以很多模板不能拿过来直接用,要经过简单的修改才能使用, ...

  10. 11:HTML5 发展史

    11:HTML5 发展史 HTML5草案的前身名为 Web Applications 1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的 HTML 工作团队. HTML 5 ...