栈管运行,堆管存储。
栈管运行时的问题,即程序如何执行,执行到哪里了,或者说如何处理数据;
堆:解决的是数据存储问题,即数据放哪里。

1. 虚拟机栈

|

1.1 是什么?

1)每个线程创建时,都会创建一个虚拟机栈。其内部保存一个个栈帧(一个栈帧对应一个方法调用)。
2)和pc寄存器一样,都是线程私有的。
3)随着线程的创建而创建,线程的消亡而消亡。 | | —- | |

1.2 有什么用?

主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回结果。
image.png | |

1.3 虚拟机栈的优点

1)速度仅次于pc计数器;
2)只存在进栈出栈的过程;
3)不存在GC, 但可能会 oom(out of memory) |

2. 常见的问题

image.png

2.1 设置栈中内存大小 -Xss

|

3. 栈的结构

第05章_方法与栈桢.jpg
第05章_栈桢内部结构.jpg

4. 栈帧—局部变量表

|

4.1 定义

局部变量表也称为局部变量数组或本地变量表。是一个数字数组。 | | —- | |

4.2 作用


用于存储方法参数和定义在方法内部的局部变量。这些数据类型包括基本数据类型、对象引用以及returnAddress类型。 | |

4.3 特点


1)局部变量表是建立在线程之上的,是线程的私有属性,所以没有安全问题;
2) 局部变量表所需的容量大小是在编译时期确定下来的,并保存在方法的code属性的maximal local variable数据项中。运行期间大小不会改变。 |

5. 栈帧—操作数栈(operand stack)

image.png

5.1 面试题:

程序员面试过程中, 常见的i++和++i 的区别,放到字节码篇章时再介绍。 | | i++1.png | | i++2.png | | i++3.png | | i++4.png |

6. 栈帧—动态链接

动态链接.png

7. 方法的调用

image.png