重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?程序方法如何被执行?虚拟机执行引擎的工作机制
Class文件二进制字符流通过类加载器和虚拟机加载到内存(方法区)完成在内存上的布局和初始化后,虚拟机字节码执行引擎就可以执行相关代码实现程序所定义的功能。虚拟机执行引擎执行的对象是方法(均特指非本地方法),方法是
着一个程序所定义的一个功能的载体,实现预定的业务功能或者特定的功能等。虚拟机执行引擎就是执行程序方法的一个引擎,一个类的信息通过方法承载了它所担负的功能职责,程序的执行就是一个个方法的执行和相互调用。
方法的内容有:方法名,参数列表,返回值,内部定义的局部变量,方法的可见性,方法内部的执行操作和符号引用等等。虚拟机执行引擎要执行方法,首先就需要用单独的数据结构来存放定义方法签名信息和内部定义的局部变量等。然后
方法内部引用到了外部类或者方法等信息就需要进行相关符号引用的解析,而且在允许方法出现重载的情况下还要特定的机制用来确定最终要执行的方法版本。最后还要告诉底层硬件将要如何执行预定的程序代码。
Java虚拟机内存内针对方法的执行专门划分了一个区域即虚拟机栈。虚拟机栈内通过栈帧结构来存储调用方法和执行方法需要的局部变量,操作数栈、方法返回值等,通过栈帧的出入栈来表示方法的执行顺序。
1、栈帧结构:虚拟机内如何存储方法的内容,方法如何在虚拟机内的表示
栈帧的结构也就是程序方法的结构,栈帧结构存储了方法的内容。栈帧的出栈入栈代表了方法的执行过程和方法执行模型。
|
栈帧组成 |
用途、作用、功能 |
特点 |
其他 |
| 局部变量表 | 变量值存储空间,用于存放方法需要的参数和局部变量 | 以变量槽Slot为最小单位,每个Slot存储特定类型的数据信息,且可重用 局部变量表内的变量在虚拟机类的加载过程中不进行系统默认值初始化。 |
静态方法: 实例方法:第0位索引存放方法所属对象实例的引用 |
| 操作栈 | 用于存放字节码操作指令执行所需要的操作数值和操作执行结果值 | 32位数据占用1个操作栈,64位数据占用两个操作栈 | |
| 动态连接 | 运行期将相关的符号引用转换为直接引用 | 静态连接:在类加载或者第一次使用的时候转换为直接引用 | 栈帧信息 |
| 返回地址 | 方法执行完成的结果值 | 栈帧信息 | |
| 附加信息 | 附加到栈帧上的一些信息 | 栈帧信息 |
2、方法的调用:解析方法的符号引用和确定方法的版本
(1)虚方法和非虚方法
只有在允许方法重载的情况下才有虚方法和非虚方法之分,因为在允许重载的情况下方法的版本不止一个,在方法的执行前需要特定的机制确定将要执行的方法版本。
非虚方法:能够在解析阶段(将符号引用转换为直接引用)确定方法执行版本的方法。在解析阶段能够确定方法版本的有:静态方法,私有方法,实例构造器,父类方法,final修饰的方法
虚方法:只有在运行期才能够最终确定方法执行版本的方法。
(2)解析
方法调用时,方法执行前将方法内的符号引用转换为直接引用的过程
解析调用时一个静态的过程,在编译期内就能够完全确定。类加载过程中解析阶段就会把涉及的符号引用直接转换为直接引用。
(3)分派
确定方法最终调用的版本的步骤。
1)静态分派和动态分派:
静态分派(编译期分派):在编译期根据静态类型来定位方法执行的版本的分配过程,因为静态类型在编译期可知.Java虚拟机方法重载的规则就是根据参数的静态类型确定最终执行的方法版本的。
动态分派(运行期分派):在运行期根据实际类型来确定最终执行的方法版本的分派过程
2)方法的重载和重写
3、虚拟机如何执行方法?虚拟机执行引擎的工作机制
(1)解释执行(通过解释器执行)
|
指令集 |
优点 |
缺点 |
应用情况 |
| 基于栈的指令集 | 可移植,代码相对紧凑、编译器实现简单 | 执行速度慢 | |
| 基于寄存器的指令集 | 受硬件约束大,不可移植性 | 执行速度快 | 主流物理机采用 |
(2)编译执行(通过JIT编译器产生本地代码执行)

重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?程序方法如何被执行?虚拟机执行引擎的工作机制的更多相关文章
- JVM总结-虚拟机怎么执行字节码
1. JRE,JDK JRE : 包含运行 Java 程序的必需组件,Java 虚拟机+ Java 核心类库等. JDK : JRE + 一系列开发.诊断工具. 2. java字节码 编译器将 Ja ...
- 深入理解Java AIO(二)—— AIO源码解析
深入理解Java AIO(二)—— AIO源码解析 这篇只是个占位符,占个位置,之后再详细写(这个之后可能是永远) 所以这里只简单说一下我看了个大概的实现原理,具体的等我之后更新(可能不会更新了) 当 ...
- Java安全之动态加载字节码
Java字节码 简单说,Java字节码就是.class后缀的文件,里面存放Java虚拟机执行的指令. 由于Java是一门跨平台的编译型语言,所以可以适用于不同平台,不同CPU的计算机,开发者只需要将自 ...
- JVM总结(五):JVM字节码执行引擎
JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 ...
- 【JDK命令行 一】手动编译Java源码与执行字节码命令合集(含外部依赖引用)
写作目标 记录常见的使用javac手动编译Java源码和java手动执行字节码的命令,一方面用于应对 Maven 和 Gradle 暂时无法使用的情况,临时生成class文件(使用自己的jar包):另 ...
- 《深入理解Java虚拟机》学习笔记之字节码执行引擎
Java虚拟机的执行引擎不管是解释执行还是编译执行,根据概念模型都具有统一的外观:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 栈帧(Stack Frame) ...
- 8.5(java学习笔记)8.5 字节码操作(javassist)
一.javassist javassist让我们操作字节码更加简单,它是一个类库,允许我们修改字节码.它允许java程序动态的创建.修改类. javassist提供了两个层次的API,基于源码级别的和 ...
- 记一次使用修改字节码的方法解决java.lang.NoSuchMethodError
接兔兔国际sdk ane 充值界面选择兔币充值就会闪退, 观察logcat 04-19 10:10:54.224: E/AndroidRuntime(20315): FATAL EXCEPTION: ...
- Java Eclipse编译后产生的字节码文件,用DOS命令符怎么打开
在很多初学者刚刚接触eclipse的时候,写完一个代码文件.例如 Demo.java 通过run as a java application生成之后,会产生一个Demo.class. Demo.cla ...
随机推荐
- 从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同
例一:毛刺在往外凸的面上 策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域. read_image (Tu, 'C:/Users/xiahu ...
- Android5.0通知变化浅析
目前在Android中通知的使用还是很常见的,为了做版本兼容,常用兼容包NotificationCompat.Builder和 Notification.Builder. NotificationCo ...
- 【转】WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等 本文主要内容: CheckBox复选框的自定义样式,有两种不同的风格实现: RadioB ...
- Mysql系列二:Mysql 开发标准规范
原文链接:http://www.cnblogs.com/liulei-LL/p/7729983.html 一.表设计 1. 库名.表名.字段名使用小写字母,“_”分割. 2. 库名.表名.字段名不超过 ...
- 小程序返回顶部top滚动
wxjs const app = getApp(); Page({ data:{ // top标签显示(默认不显示) backTopValue:false }, // 监听滚动条坐标 onPageSc ...
- Ubuntu中apt与apt-get命令的区别
https://blog.csdn.net/taotongning/article/details/82320472
- Hibernate常见面试题(转)
在Java J2EE方面进行面试时,常被问起的Hibernate面试问题,大多都是针对基于Web的企业级应用开发者的角色的.Hibernate框架在Java界的成功和高度的可接受性使得它成为了Java ...
- css布局 - 垂直居中布局的一百种实现方式(更新中...)
首先将垂直居中的现象和实现方式两大方向细分类如下: 接下来逐条累加不同情况下的垂直居中实现. 目录: 一.父元素高度固定时,单行文本 | 图片的垂直居中 1. line-height行高简单粗暴实现法 ...
- libuv示例代码
https://github.com/nikhilm/uvbook/tree/master/code
- iOS - 极光推送证书的创建及过期处理
无论iPhone还是安卓,我们用到的所有应用基本都有推送通知服务,因为这是应用很好的推广方式,有新产品了.有新更新了通知下用户及时查看.但Apple有点特殊,它的推送需要发到苹果服务器上中转一下,这就 ...