《JVM-虚拟机字节码执行引擎》学习笔记
其他
2019-04-01 22:24:20
阅读次数: 0
一、运行时栈帧结构
![虚拟机运行时数据区域](https://img-blog.csdnimg.cn/20190109102754686.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MzEyNjgz,size_16,color_FFFFFF,t_70)
![栈帧](https://img-blog.csdnimg.cn/20190109103303409.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MzEyNjgz,size_16,color_FFFFFF,t_70)
- 执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。
1.局部变量表
- 局部变量表是一组变量值存储空间,用于存储方法参数和方法内部定义的局部变量。
- 局部变量表最小存储单元----Slot
- double和long是64位,分配两个连续的Slot空间,由于局部变量表建立在线程的堆栈上,是线程私有的数据,无论读写两个连续的Slot是否位原子操作,都不会引起数据安全问题。
- 出现线程安全性问题要有以下条件:多线程;共享资源;对共享资源进行非原子性操作。
- Slot复用:方法体中定义的变量,其作用域并不一定会覆盖整个方法体,如果当前字节码PC计数器的值已经超出了某个变量的作用域,那这个变量对应的Slot就可以交给其他变量使用。
2.操作数栈
![原则](https://img-blog.csdnimg.cn/20190109142136337.png)
![原则](https://img-blog.csdnimg.cn/2019010914221712.png)
- 上下栈帧的部分局部变量表重回,共用一部分数据,无需进行额外的参数复制传递。
3.动态连接
- Class文件的常量池含有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数。符号引用在类加载阶段或第一次使用时转换为直接引用称为静态解析;在每次运行期间转化为直接引用称为动态连接。
4.方法返回地址
![方法返回地址](https://img-blog.csdnimg.cn/20190109143750740.png)
5.附加信息
![附加信息](https://img-blog.csdnimg.cn/20190109144023291.png)
二、方法调用
- 方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪个方法)
1.解析
- 调用目标在程序代码写好、编译器进行编译时就必须确定下来。这类方法的调用称为解析。
- 解析调用:静态方法,私有方法,实例构造器,父类方法,final方法。
2.分派
(1)静态分派
- 所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。静态分派的典型应用是方法重载。
(2)动态分派
![动态分派](https://img-blog.csdnimg.cn/20190110095919292.png)
3.动态语言支持
![动态语言支持](https://img-blog.csdnimg.cn/2019011010145050.png)
三、字节码执行引擎小结
转载自blog.csdn.net/qq_39312683/article/details/86134643