Java 虚拟机栈区域

JVM 栈区域的一些注意关键点:

  • 在创建线程期间,Java 虚拟机会创建一个单独的栈。
  • 栈只有两种操作,入栈和出栈。
  • 当线程运行时,与之相关联的栈就是运行时栈。
  • 线程执行的每个方法调用、中间计算、局部变量的分配、参数调用等都作为操作存储在运行时栈中。
  • 当线程停止或者执行完毕时,栈的各部分都会被删除。
  • 当线程所有的方法都完成,栈就变成了空栈,然后被删除。
  • 在线程进入 terminating 状态之前,JVM 会销毁和线程相关的栈。
  • 存储线程数据的栈只对当前线程可见,其它线程不可见。
  • 也就是说存储在栈内的数据是线程安全的。
  • 和线程相关的栈的数据就是活跃记录(activation record)也叫栈帧(stack frame)。

注意:JVM 的栈内存并不要求连续存储。

栈帧的结构如下:

栈帧由三个部分组成:

  • 本地变量数组
  • 操作数栈
  • 帧数据

JVM 根据 class 的数据类型来创建合适大小的栈帧。

操作数栈函数就像是 JVM 的工作空间 - 它用来存储中间计算的结果。它的数据结果和本地变量数组类似,区别是它可以通过入栈和出栈来访问。

帧数据 - 包含常量数据值和方法的返回数据。另外它还包含了 Exception 表的引用,当异常需要捕获并在 console 展示时,该 Exception 表包含了 catch 代码块需要的所有的信息。

原文链接:https://www.tutorialspoint.com/java-virtual-machine-jvm-stack-area