JVM栈变量

4
我了解JVM为每个线程创建一个栈,该栈包含对其他方法的调用,当线程调用它们时。但我不理解当它说栈也会有局部变量和部分结果时的意思。我认为全局和局部变量(基本类型和引用)应该存在于堆中而不是栈中,请问有人可以详细说明一下吗?其次,它说部分结果,这是否意味着在线程切换发生时,这些半执行的结果(复制品)来自于局部和实例变量?
谢谢
-Abidi

为什么你不选择一个答案作为正确的答案呢? - Koray Tugay
2个回答

6
每个JVM都有一个方法调用帧的运行时堆栈。每个方法框架包含:
  • 引用包含该方法的Java类。
  • 用于保存临时值的操作数堆栈。
  • “本地变量”数组,用于保存函数参数和临时结果。
本地变量数组存在的原因是,当函数首次被调用时,该函数的参数需要存储在某个地方。本地变量数组实际上并不保存在Java源代码中声明的所有局部变量;相反,它更像是一个临时缓冲区,用于保存在堆中声明的Java对象的引用,或者用于保存引用次数足够多的值,将它们放在运行时堆栈上会很慢或效率低下。
简而言之,您说的局部变量和全局变量存储在堆中是正确的。Java线程中的“本地变量”数组不对应这些局部变量,而是对应线程在解释方法字节码时使用的临时空间。

1
+1,但我会将“全局变量存储”替换为“对全局变量的引用存储”,因为堆栈仅包含引用或原始值。 - Ingo

0
每个JVM都有一个运行时方法调用帧的堆栈。每个方法帧包含:
A reference to the Java class containing that method.
An operand stack for holding temporary values.
A "local variables" array for holding function arguments and temporary results.

这个本地变量数组的存在是为了在首次调用函数时,可以将该函数的参数存储在某个位置。本地变量数组并不实际持有在Java源代码中声明的所有局部变量;相反,它更像是一个临时缓冲区,用于保存在堆中其他位置声明的Java对象的引用,或者保存引用次数足够多的值,因为将它们放在运行时堆栈上会很慢或低效。

简而言之,您是正确的,局部变量和全局变量都存储在堆中。Java线程中的“本地变量”数组不对应于这些局部变量,而是对应于解释该方法的字节码时线程使用的临时空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接