一、JVM和Java体系结构(18)


dog虚方法表:
虚方法表:
cat虚方法表:
9、方法返回地址( )
存放调用该方法的pc寄存器的值 。
一个方法的结束,有两种方式:
无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置 。方法正常退出时,调用者的c计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址 。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息 。
PC寄存器存储下一条指令的地址,当有一个方法结束运行时,此时要执行下一个方法的指令,就需要把PC寄存器里的值作为这个方法的返回值返回 。
本质上,方法的退出就是当前栈帧出栈的过程 。此时,需要恢复上层方法的局部变量表、操作数栈、将返回值压入调用者栈帧的操作数栈、设置PC寄存器值等,让调用者方法继续执行下去 。
正常完成出口和异常完成出口的区别在于:通过异常完成出口退出的不会给他的上层调用者产生任何的返回值 。
当一个方法开始执行后,只有两种方式可以退出这个方法:
1、执行引擎遇到任意一个方法返回的字节码指令(),会有返回值传递给上层的方法调用者,简称正常完成出口
package com.lxg.java3;import java.io.FileReader;import java.io.IOException;import java.util.Date;/**** 返回指令包含ireturn(当返回值是boolean、byte、char、short和int类型时使用)、* lreturn、freturn、dreturn以及areturn,另外还有一个return指令供声明为void的方法、* 实例初始化方法、类和接口的初始化方法使用 。** @author shkstart* @create 2020 下午 4:05*/public class ReturnAddressTest {public boolean methodBoolean() {return false;}public byte methodByte() {return 0;}public short methodShort() {return 0;}public char methodChar() {return 'a';}public int methodInt() {return 0;}public long methodLong() {return 0L;}public float methodFloat() {return 0.0f;}public double methodDouble() {return 0.0;}public String methodString() {return null;}public Date methodDate() {return null;}public void methodVoid() {}static {int i = 10;}//public void method2() {methodVoid();try {method1();} catch (IOException e) {e.printStackTrace();}}public void method1() throws IOException {FileReader fis = new FileReader("atguigu.txt");char[] cBuffer = new char[1024];int len;while ((len = fis.read(cBuffer)) != -1) {String str = new String(cBuffer, 0, len);System.out.println(str);}fis.close();}}
2、在方法执行的过程中遇到了异常(),并且这个异常没有在方法内进行处理,也就是只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出 。简称异常完成出口 。
方法执行过程中抛出异常时的异常处理,存储在一个异常处理表,方便在发
生异常的时候找到处理异常的代码 。
10、一些附加信息
栈帧中还允许携带与Java虚拟机实现相关的一些附加信息 。例如,对程序调试提供支持的信息 。
11、栈的相关面试题 1、举例栈溢出的情况?
通过-Xss设置栈的大小
递归调用方法
chatgpt:栈溢出是指程序在使用栈空间时,向栈空间写入数据时超出了栈空间的大小,导致数据覆盖了栈空间之外的内存区域 。以下是一些可能导致栈溢出的情况:1. 递归调用过深,导致栈空间被耗尽 。2. 函数中定义了过多的局部变量,导致栈空间不足 。3. 函数中定义了过大的局部变量或数组,导致栈空间不足 。4. 函数中使用了过多的参数,导致栈空间不足 。5. 函数返回值过大,导致栈空间不足 。6. 函数调用时未正确保存现场,导致返回地址等数据被覆盖 。这些情况都可能导致栈溢出,造成程序崩溃或安全漏洞 。因此,在编写程序时应当注意避免这些情况的发生 。