概述
1.先说虚拟机栈:
虚拟机栈是位于虚拟机内存中的一片内存区域,它是线程私有的(一个线程分配一个虚拟机栈空间)。它用来存储栈帧,一个栈帧就对应着一个方法。栈帧的出栈和入栈对应着方法的结束和调用的开始。
2.再说栈帧
一个完整的栈帧保存着以下信息:局部变量表,操作数栈,栈帧信息三大部分,下面我们依次解析这三个部分。
2.1局部变量表:
局部变量表存储着方法的参数和局部变量。这些表项可以是基本类型数据和引用数据类型,特别要注意的是引用数据类型:一个引用类型信息应该能做到两点:1)通过这个引用找到这个引用对象在堆中数据存放的起始地址入口(即对象在内存中的物理地址)。2)通过这个引用能够找到对象的实际类型在方法去中的类型信息(存储着类变量以及方法等)。
2.2操作数栈
用来执行方法中的具体代码,如:计算,赋值,判断等等操作。【个人看来操作数栈更像是一种辅助工具,用来存储中间的操作结果】
2.3栈帧信息
栈帧信息包括:方法本身的符号引用,方法返回地址,附加信息。
方法本身的符号引用:指向方法区中运行时常量池中的该方法的入口地址。如果这个方法是非虚方法,那么这个符号引用在编译时就转化为直接引用,如果这个符号引用是一个虚方法,那么会在方法调用的时候动态链接到对应的方法。
方法返回地址:一个方法的返回方式只有两种:1)执行引擎遇到返回return语句,这时候会将返回值传递给上层的方法调用者,这种退出方法的方式称为正常完成出口。2)方法执行过程中出现异常,并且这个异常没有在方法中得到处理,只要本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出,这种退出方式称为异常完成出口,不会给他的上层调用者任何返回值。
附加信息:一些调试信息或者其他的附加信息。
3.最后说虚拟机栈如何插入与消除栈帧:
方法调用在一个线程中采用的是责任链机制,每当调用一个方法的时候会就会向当前栈帧中插入该方法对应的栈帧,只有栈顶的方法是当前线程有效的(即正在运行的)。方法退出的时候,会返回到上一层栈帧继续程序的执行。
最后
以上就是鲜艳蛋挞为你收集整理的分析JVM虚拟机栈的栈帧结构的全部内容,希望文章能够帮你解决分析JVM虚拟机栈的栈帧结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复