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