退出方法时堆栈会发生什么情况?

2022-09-03 15:48:08

我正在阅读堆栈和堆是什么以及在哪里?我有点模糊的一件事是,在方法退出后堆栈会发生什么。以这张图片为例:

Stack

退出方法后将清除堆栈,但这是什么意思?堆栈上的指针是否刚刚移回堆栈的开头,使其为空?我希望这不是一个太宽泛的问题。我真的不确定当堆栈从退出方法中清除时,幕后发生了什么。


答案 1

调用方法时,局部变量位于堆栈上。对象引用也存储在堆栈上,相应的对象存储在堆中。

堆栈只是内存的一个区域,它有一个开始和结束地址。JVM(java虚拟机)有一个寄存器,它指向堆栈的当前顶部(堆栈指针)。如果调用新方法,则会将偏移量添加到寄存器中,以获取堆栈上的新空间。

当方法调用结束时,堆栈指针将减少此偏移量,这将释放分配的空间。

局部变量和其他东西(如返回地址,参数...)可能仍在堆栈上,并将被下一个方法调用覆盖。

顺便说一句:这就是为什么java将所有对象存储在堆中的原因。当对象位于堆栈上,并且您返回指向堆栈的引用时,下一个方法调用可能会销毁该对象。


答案 2

在函数执行期间,将在堆栈中创建所有局部变量。这意味着堆栈会增长,以便为这些变量腾出足够的空间。

当函数结束时,所有局部变量都超出范围,堆栈被倒带。不需要发生其他任何事情,没有隐式清零内存。但:

  • 从语义上讲,变量超出范围,无法再使用
  • 在困难的方式中,堆栈指针被倒带,有效地释放了内存:它将被下一个函数调用使用。

以上不仅适用于函数,而且对于任何代码块都是相同的,因为从语义上讲,块中定义的变量在块末尾超出范围。