JVM学习之:虚拟机中的运行时栈帧总结(二)
2012-09-24 22:23
309 查看
在
JVM学习之:虚拟机中的运行时栈帧总结(一) 虚拟机栈的情况做了一个简单的介绍,也对虚拟机栈中的局部变量表做了简单的介绍,本篇文章主要是简单的总结一下在虚拟机栈帧的其他组成部分.虚拟机栈帧除了局部变量表,还包括操作数栈,动态连接,以及方法的返回地址等结构
(一)操作数栈:
首先根据名称可以看出操作数栈是一个基本的栈来实现数据结构,那么它自然也遵守栈的后入先出的原则.其次,它里面主要存放的是一些算数运算用到的参数也可能是中间结果,也可能是在调用其他方法时需要用到的参数,通过这点可以看出,方法刚刚开始执行的时候,这个里面是空的.最后 要说明的是操作数栈中可以存放任意的java数据类型,包括long和double,且32位的数据类型占一个栈空间,64位的数据类型占2个栈空间.
(二)动态连接:
在说明什么是动态连接之前先看看方法的大概调用过程,首先在虚拟机运行的时候,运行时常量池会保存大量的符号引用,这些符号引用可以看成是每个方法的间接引用,如果代表栈帧A的方法想调用代表栈帧B的方法,那么这个虚拟机的方法调用指令就会以B方法的符号引用作为参数,但是因为符号引用并不是直接指向代表B方法的内存位置,所以在调用之前还必须要将符号引用转换为直接引用,然后通过直接引用才可以访问到真正的方法,这时候就有一点需要注意,如果符号引用是在类加载阶段或者第一次使用的时候转化为直接应用,那么这种转换成为静态解析,如果是在运行期间转换为直接引用,那么这种转换就成为动态连接
(三)方法的返回地址
这一部分的内容相对于前面的两个结构而言会更容易理解一点.
方法的返回分为两种情况,一种是正常退出,退出后会根据方法的定义来决定是否要传返回值给上层的调用者,一种是异常导致的方法结束,这种情况是不会传返回值给上层的调用方法.
不过无论是那种方式的方法结束,在退出当前方法时都会跳转到当前方法被调用的位置,如果方法是正常退出的,则调用者的PC计数器的值就可以作为返回地址,如果是因为异常退出的,则是需要通过异常处理表来确定.
在JVM学习之:虚拟机中的运行时栈帧总结(一)
有提到,方法的的一次调用就对应着栈帧在虚拟机栈中的一次入栈出栈操作,因此方法退出时可能做的事情包括,恢复上层方法的局部变量表以及操作数栈,如果有返回值的话,就把返回值压入到调用者栈帧的操作数栈中,还会把PC计数器的值调整为方法调用入口的下一条指令
上面的内容为自己根据一些资料再结合一些自己的理解总结出来的内容,如果不完整或者是不正确的,还请补充完善
JVM学习之:虚拟机中的运行时栈帧总结(一) 虚拟机栈的情况做了一个简单的介绍,也对虚拟机栈中的局部变量表做了简单的介绍,本篇文章主要是简单的总结一下在虚拟机栈帧的其他组成部分.虚拟机栈帧除了局部变量表,还包括操作数栈,动态连接,以及方法的返回地址等结构
(一)操作数栈:
首先根据名称可以看出操作数栈是一个基本的栈来实现数据结构,那么它自然也遵守栈的后入先出的原则.其次,它里面主要存放的是一些算数运算用到的参数也可能是中间结果,也可能是在调用其他方法时需要用到的参数,通过这点可以看出,方法刚刚开始执行的时候,这个里面是空的.最后 要说明的是操作数栈中可以存放任意的java数据类型,包括long和double,且32位的数据类型占一个栈空间,64位的数据类型占2个栈空间.
(二)动态连接:
在说明什么是动态连接之前先看看方法的大概调用过程,首先在虚拟机运行的时候,运行时常量池会保存大量的符号引用,这些符号引用可以看成是每个方法的间接引用,如果代表栈帧A的方法想调用代表栈帧B的方法,那么这个虚拟机的方法调用指令就会以B方法的符号引用作为参数,但是因为符号引用并不是直接指向代表B方法的内存位置,所以在调用之前还必须要将符号引用转换为直接引用,然后通过直接引用才可以访问到真正的方法,这时候就有一点需要注意,如果符号引用是在类加载阶段或者第一次使用的时候转化为直接应用,那么这种转换成为静态解析,如果是在运行期间转换为直接引用,那么这种转换就成为动态连接
(三)方法的返回地址
这一部分的内容相对于前面的两个结构而言会更容易理解一点.
方法的返回分为两种情况,一种是正常退出,退出后会根据方法的定义来决定是否要传返回值给上层的调用者,一种是异常导致的方法结束,这种情况是不会传返回值给上层的调用方法.
不过无论是那种方式的方法结束,在退出当前方法时都会跳转到当前方法被调用的位置,如果方法是正常退出的,则调用者的PC计数器的值就可以作为返回地址,如果是因为异常退出的,则是需要通过异常处理表来确定.
在JVM学习之:虚拟机中的运行时栈帧总结(一)
有提到,方法的的一次调用就对应着栈帧在虚拟机栈中的一次入栈出栈操作,因此方法退出时可能做的事情包括,恢复上层方法的局部变量表以及操作数栈,如果有返回值的话,就把返回值压入到调用者栈帧的操作数栈中,还会把PC计数器的值调整为方法调用入口的下一条指令
上面的内容为自己根据一些资料再结合一些自己的理解总结出来的内容,如果不完整或者是不正确的,还请补充完善
相关文章推荐
- JVM学习之:虚拟机中的运行时栈帧总结
- JVM学习之:虚拟机中的运行时栈帧总结(一)
- Java虚拟机jvm学习一:认识jvm的运行机制
- JVM虚拟机学习一:垃圾回收算法总结
- 《深入理解 Java 虚拟机》学习笔记(1)—— JVM 运行时数据区
- 《深入理解 Java 虚拟机》学习笔记(1)—— JVM 运行时数据区
- 《深入理解 Java 虚拟机》学习笔记(1)—— JVM 运行时数据区
- 《深入理解java虚拟机》学习-第八章-虚拟机字节码执行引擎-运行时栈帧结构
- JVM学习——通过实例总结Java虚拟机的运行机制
- 深入理解Java虚拟机JVM高级特性与最佳实践阅读总结——第二章 Java内存区域与内存溢出异常
- JVM相关学习记录与总结(内存&GC&类加载&工具)
- JVM学习总结--JVM简介
- 高性能javascript学习总结(1)--加载与运行
- 深入理解JVM虚拟机学习笔记(—)内存区域与内存溢出异常
- JVM学习笔记:Java运行时数据区域
- JVM运行时数据区总结分享
- JVM内存管理学习总结
- JVM学习总结五(番外)——VisualVM
- JVM 学习笔记-java程序编译和运行的过程
- Struts学习总结(二)---Struts2的架构和运行流程