虚拟机栈

时间:2020-05-10 16:52:32   收藏:0   阅读:47

由于跨平台的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的

优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

栈是运行时的单位,而堆是存储的单位。

即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪

Java虚拟机栈

栈的优点:

栈可能出现的异常

Java虚拟机规范允许java栈的大小是动态的或者是固定不变的。

设置栈内存的大小

我们可以使用参数-Xss选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度。

栈中存储什么?

栈运行原理

栈帧的内部结构

每个栈帧存储着:

后三者也被称为帧数据区

局部变量表

变量槽slot

补充说明

操作数栈

在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈和出栈

栈顶缓存技术

基于栈式架构的虚拟机使用的零地址指令更加紧凑,但完成一项操作的时候必然需要使用更多的入栈和出栈指令,这同时也就意味着更多的指令分派(instruction dispatch)次数和内存读/写次数。

而操作数是存储在内存中的,因此频繁地执行内存读/写操作必然会影响执行速度。为了解决这个问题,HotSpot JVM的设计者们提出了栈顶缓存技术(ToS,Top-of-Stack Caching),将栈顶元素全部缓存在物理CPU的寄存器中,以此降低对内存的读写次数,提升执行引擎的执行效率

动态链接

方法的调用

方法绑定机制

在JVM中,将符号引用转为调用方法的直接引用与方法的绑定机制相关。

上面两种链接对应早期绑定和晚期绑定(多态)

虚方法与非虚方法

方法重写的本质

  1. 找到操作数栈顶的第一个元素所执行的对象的实际类型,记作c
  2. 如果在类型c中找到与常量中的描述符和简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束;如果不通过,则返回java.lang.IllegalAccessError异常
  3. 否则,按照继承关系从下往上一次对c的各个父类进行第二步的搜索和验证过程。
  4. 如果始终没有找到合适的方法,则抛出java.lang.AbstractMethodError异常

虚方法表

方法返回地址

存放调用该方法的PC寄存器的值

方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。

原文:https://www.cnblogs.com/ylcc-zyq/p/12863486.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!