Java
1、栈帧
理解:
栈帧就像是恋爱中的甜蜜约定!每当方法调用来临,它就像心动的那一刻,悄悄出现在内存里,装载着我们的爱意。它们就像是我们的恋爱小秘密,存储着宝贵的局部变量和操作数,让我们的程序可以亲密无间地交流。每一次调用结束,栈帧就像是美好的回忆,温柔地消散在空中,却留下了深深的印记。真是让人感到满满的幸福和甜蜜呢!
chatgpt:
Java栈帧(Stack Frame)是在Java虚拟机(JVM)中用于支持方法调用和执行的一种数据结构。每当执行一个方法时,都会在线程的栈上创建一个栈帧来存储方法的局部变量、操作数栈、动态链接信息和方法返回地址等相关数据。
栈帧由以下几个主要部分组成:
-
局部变量表(Local Variable Table):局部变量表用于存储方法中定义的局部变量和方法参数。这些局部变量包括基本类型(如整数、浮点数)和对象引用。局部变量表的大小在编译期确定,并且在方法调用时分配和释放。
-
操作数栈(Operand Stack):操作数栈用于执行方法时的临时计算和操作。它可以存储和处理方法中的操作数,如整数、浮点数和对象引用等。操作数栈通过压栈(push)和出栈(pop)操作来完成计算过程。
-
动态链接信息(Dynamic Linking):栈帧中还包含了动态链接信息,用于在运行时解析和连接方法的引用。它包括方法调用的目标方法的符号引用和实际入口地址,以便在运行时能够正确地执行方法调用。
-
方法返回地址(Return Address):方法返回地址记录了方法执行完后需要返回的位置。它可以是一个指向调用方法的下一条指令的地址,也可以是异常处理器的地址,用于处理异常情况。
-
附加信息:栈帧的高度、虚拟机版本信息
栈帧信息:附加信息+动态链接+方法的返回地址
栈帧的创建和销毁是根据方法的调用和返回进行的。每当一个方法被调用时,JVM会创建一个新的栈帧并将其推入当前线程的栈顶。而当方法执行完成或遇到返回指令时,栈帧会被弹出并销毁,控制权返回给调用方。
通过栈帧,Java虚拟机能够支持方法的嵌套调用和执行,保证了方法间的数据隔离和程序的正确执行。
生命周期:随着方法的调用而创建,随着方法结束而销毁,
存储:方法的局部变量信息
局部变量表:方法中定义的局部变量以及方法的参数,单纯的存储单元
操作数栈:压栈出栈的方式存储操作数
int a=1;
int b=1;
int c=a+b;
//a,b放入局部变量表 a、b拿出来 在操作数栈操作 在放回去
方法返回地址:两种方式退出
1、遇到方法的返回字节码指令 return
2、出现了异常,有异常处理器,没有 抛出异常
动态链接
网:动态链接是为了支持方法的的动态调用过程
官网:动态链接将这些符号引用转成直接引用 为了支持java的多态
void a(){
b();
}
void b(){
c();
}
void c(){
}
java多态的存在,只有在运行执行中知道
个人: