线程的栈是在哪里提出来了的?
Oracle官网的java虚拟机规范里面,2.5.2章节。网址:https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-2.html
下图就是我们常说的java虚拟机栈。
java虚拟机栈的栈帧具体是什么?
栈帧(Stack Frame)是以方法(Method)为基础的。栈帧里面有局部变量表(Local Variables)、操作数栈、动态连接(Dynamic Linking)、方法返回值地址等。
局部变量是存在哪里?
局部变量表里面。
- 栈帧的局部变量部分被组织为基于零的单词数组。它包含该方法的所有参数和局部变量。
- 数组中的每个插槽(slot)或条目(entry)都是4个字节(Byte),32位。
- 该数组首先被方法参数占用,然后是局部变量(有序方式)。
- 如果方法是实例方法,则局部变量数组中的第一个槽被“this”引用占用。
- int、float和reference类型的值在数组中占据1个slot or entry,即4个字节。
- double和long的值占据数组中的2个连续插槽,即总共8个字节。
- Byte、short和char值将在存储前转换为int类型,并占用1个插槽,即4个字节。
- 但是存储布尔值的方式因JVM而异。但是大多数JVM在局部变量数组中为布尔值提供了一个槽。
The Ultimate Stack Frame
Java Virtual Machine (JVM) Stack Area
Local variable Table In JVM Stack
关于方法参数传递,后面博客具体讲。推荐阅读:
形参和实参——Java值传递详细说明
探讨Java参数传递问题
感谢:
深入理解JVM虚拟机读书笔记——运行时栈帧结构
深入理解Java内存(图解堆栈)
图解栈帧,别再死记硬背