
我们这次讲的是JVM中的栈,栈在JVM中的位置如图所示:

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。【百度百科】
关于栈的动画小视频可以更好的理解栈。秒懂百科:http://baike.baidu.com/l/m2YkZz0z
上述百度百科的概念比较抽象,可能比较难以理解。下面用大白话讲一下就能很好的理解了。
栈、栈顶、栈底、入栈、出栈,这几个概念要先有个印象。
你可以把栈当作是一个没有盖子的箱子,这个箱子就是栈,箱子的底部就叫作栈底,箱子口就叫作栈顶,往箱子里放东西就是压栈(PUSH),别名进栈、入栈,从箱子中拿出东西就是出栈(POP),别名退栈,这个东西在计算机中就叫作数据。只能对顶端进行操作,数据的添加和取出分别叫作入栈和出栈。
栈是一种数据结构,它是先进后出,后进先出的。有个专业术语叫FILO(First In Last Out)。
通常说到栈我们还会与另外一种数据结构进行比较“队列”,队列就是先进先出,专业术语叫FIFO(First In First Out)。
网上有个更形象的说法,很容易就让人记住了这两种数据结构:“喝多了吐就是栈,吃多了拉就是队列”。哈哈,大家自行体会和理解哈。
栈有时候又叫作栈内存,它主管程序的运行,生命周期和线程同步。一旦线程结束,栈就Over了!线程结束,栈内存也就释放了,所以对于栈来说,它是不存在垃圾回收的问题的。
栈是运行时的单位,而堆是存储的单位。
即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放在哪儿。
特性:
即:
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。



每个栈帧的内部结构都是一样的,基本上都是包含如下信息:
我们在下图中只放大一个栈帧内容看:至于每个栈帧包含的内容可以自行百度了解。

| 运行时数据区 | 是否存在Error | 是否存在GC | 是否线程私有 |
|---|---|---|---|
| 方法区 | 是 | 是 | 否 |
| 堆 | 是 | 是 | 否 |
| 栈 | 是 | 否 | 是 |
| 程序计数器 | 否 | 否 | 是 |
| 本地方法栈 | 是 | 否 | 是 |

没有异常的代码:
package com.iot.back.streamserver.controller;/*** StackTest 此类用于:
* @author:hujm
* @date:2022年11月27日 22:12
* @remark:
*/
public class StackTest {public static void main(String[] args) {StackTest stackTest = new StackTest();// 执行方法AstackTest.methodA();}public void methodA() {System.out.println("方法methodA开始执行......");methodB();System.out.println("方法methodA执行结束......");}public int methodB() {System.out.println("方法methodB开始执行......");int b = 5;int c = methodC();System.out.println("方法methodB即将结束......");return b + c;}public int methodC() {System.out.println("方法methodC开始执行......");int c = 8;System.out.println("方法methodC即将结束......");return c;}
}
带有异常的代码:
package com.iot.back.streamserver.controller;/*** StackTest 此类用于:
* @author:hujm
* @date:2022年11月27日 22:12
* @remark:
*/
public class StackTest {public static void main(String[] args) {StackTest stackTest = new StackTest();// 执行方法AstackTest.methodA();System.out.println("main方法正常结束!");}public void methodA() {System.out.println("方法methodA开始执行......");methodB();System.out.println(1/0);System.out.println("方法methodA执行结束=======");}public int methodB() {System.out.println("方法methodB开始执行......");int b = 5;int c = methodC();System.out.println("方法methodB即将结束......");return b + c;}public int methodC() {System.out.println("方法methodC开始执行......");int c = 8;System.out.println("方法methodC即将结束......");return c;}
}
下一篇:很好的意思是什么意思