栈管运行,堆管存储。 栈管运行时的问题,即程序如何执行,执行到哪里了,或者说如何处理数据; 堆:解决的是数据存储问题,即数据放哪里。 |
---|
1. 虚拟机栈
1.1 是什么?
1)每个线程创建时,都会创建一个虚拟机栈。其内部保存一个个栈帧(一个栈帧对应一个方法调用)。
2)和pc寄存器一样,都是线程私有的。
3)随着线程的创建而创建,线程的消亡而消亡。 |
| —- |
|
1.2 有什么用?
主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回结果。 |
|
1.3 虚拟机栈的优点
1)速度仅次于pc计数器;
2)只存在进栈出栈的过程;
3)不存在GC, 但可能会 oom(out of memory) |
2. 常见的问题
![]() |
---|
2.1 设置栈中内存大小 -Xss
|
3. 栈的结构
![]() |
---|
![]() |
4. 栈帧—局部变量表
4.1 定义
局部变量表也称为局部变量数组或本地变量表。是一个数字数组。 | | —- | |
4.2 作用
用于存储方法参数和定义在方法内部的局部变量。这些数据类型包括基本数据类型、对象引用以及returnAddress类型。 |
|
4.3 特点
1)局部变量表是建立在线程之上的,是线程的私有属性,所以没有安全问题;
2) 局部变量表所需的容量大小是在编译时期确定下来的,并保存在方法的code属性的maximal local variable数据项中。运行期间大小不会改变。 |
5. 栈帧—操作数栈(operand stack)
![]() |
---|
5.1 面试题:
程序员面试过程中, 常见的i++和++i 的区别,放到字节码篇章时再介绍。 |
| |
|
|
|
|
|
|
6. 栈帧—动态链接
![]() |
---|
7. 方法的调用
![]() |
---|