2023-2更文28-jvm的栈

66 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

jvm的栈

前文

本文的主要内容是关于jvm虚拟机中的核心组成部分栈相关知识的总结。

jvm的栈

首先了解一下什么是jvm的栈。jvm的栈是jvm虚拟机的核心组成部分之一,符合栈这种数据结构先进后出的特性。而在jvm中,每个方法的执行都会在栈中放入一个栈帧。实际上对于栈来说,每个线程都会拥有自己的栈,不同线程之间的栈是互相独立的。所以我们常说的高并发,实际上是针对堆中的数据而言。也是由于每个线程都会有自己的栈,在创建线程时自然也需要考虑每个栈所占用的空间,不能无休止的创建线程,一般都会采用线程池等。

再回到栈,说完了栈,那么还需要再来看一下栈的主要组成部分,栈帧。每个方法的执行都会拥有自己的栈帧,那么栈帧的组成部分是什么呢?栈帧主要是由局部变量表、操作数栈、动态连接和返回地址等组成。首先来看什么是局部变量表,它存储了一组变量值,包括基本数据类型、对象的引用、方法的返回值等等。局部变量表的大小在编译阶段已经被确定。那么什么是操作数栈呢?它主要是在方法执行过程中数据的一些入栈、出栈等操作。也就是不停的在该栈中进行运行结果存储及读取。动态链接则是指在每一个栈帧的内部,其实都会存储指向运行时常量池中的地址,在每一次执行过程中进行直接的引用。而另外的返回地址,则主要是存放方法的返回值或方法执行的异常值。

那么栈会出现什么异常呢?首先就是和堆一样,出现内存不足异常,这种异常一般出现在栈数量创建过多时。另外,当栈的存储层级过高时,也可能出现栈的StackOverFlowException,多数情况下会出现在死循环的场景中,导致栈的创建层级过高。

总结

本文主要是对于jvm虚拟机中的栈相关知识进行了总结,并对栈的组成栈帧、栈的异常等等内容进行了介绍。