方法返回地址、附加信息
一、方法返回地址
存放调用该方法的PC寄存器的值。
一个方法的结束,有两种方式
- 正常执行完成。
- 出现未处理的异常,非正常退出。
无论哪种方式退出,在方法退出后都返回到该方法被引用的位置。方法正常退出时,调用者的PC寄存器的值作为返回地址,即调用该方法指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定的,栈帧中一般该不会保存这部分信息。
正常完成出口和异常完成出口的区别在于通过异常完成出口退出的不会给它的上层调用者产生任何的返回值。
指令返回包含ireturen、dreturn、lreturen、areturn,另外还有一个return指令供声明为void方法、实例方法、类和接口初始化使用。
二、一些附加信息
栈帧中还允许携带与java虚拟机实现相关的一些附加信息。例如对程序调试提供支持的信息。
三、虚拟机栈的五道面试题
举例栈溢出的情况?
StackOverflowError。
调整栈的大小,就能保证不出现溢出吗?
不能,只可以是栈溢出的时间出现的更晚。
分配的栈内存越大越好吗?
不是,栈内存分配得越大,其他的内存就会小,也会导致JVM性能降低。
垃圾回收是否涉及到虚拟机栈?
不会的。栈只管运行,因此运行完成之后,啥都没有了,所以不需要垃圾回收。
方法中定义的局部变量是否是线程安全的?
如果局部变量产生与方法体内,消亡与方法体内,那么就是线程安全的。否则不是。也就是说如果局部变量作为方法参数或者返回值,那么就不是线程安全的。