JVM进阶知识(一):初识 JAVA 栈

一、前言 若想自己编写的java程序高效运行,以及进行正确、高效的异常诊断,jvm是不得不谈的一个话题。本”jvm进阶“专栏大部分内容均来源于经典书籍《深入理解java虚拟机》。
二、栈存储 言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看下图:
这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。
栈是我们最常用的内存区域。它主要用来存放基本类型变量,局部变量以及对象的引用。例如:user user = new user();这里的user就是对象的引用也可以理解为地址,指引着虚拟机要去哪里找user这个对象。 他们的基本关系如图:
由上图可知,当我们将一个对象作为方法的参数时,我们在方法中改变对象的值,也会影响到原来对象的值,因为我们只是改变了图中内存区域的值,他的指引(地址)还是一样的。同时也可以看出,栈的内存区域是连续的,有大小限制的,如果超过了就会抛出栈溢出的异常stackoverflowerror。
在每个方法执行的时候,都会创建一个个的栈帧,用于保存局部变量表,操作数栈,动态链接等信息(以后都会详细讲解)。每次方法的调用都会对应着一个栈帧,因此可以解释当我们在写递归程序的时候会不小心报栈溢出的异常,因为栈是有限的,方法调用太多次导致栈帧堆满了栈,所以溢出。看下面代码:
public class test {private static int stacklength = 0;private static void main(string[] args) { try { test test = new test(); test.stackoverflow(); } catch (throwable e) { system.out.println(stacklength: + stacklength); throw e; }}public void stackoverflow() { // 疯狂递归调用 stacklength++; stackoverflow();}}
在参数-xss128k的情况下的报错。(eclipse中设置参数:右键代码选择run as-->run configurations,在arguments栏下的vm arguments中填入参数,再apply,再run)
每次在方法执行完毕的时候,虚拟机会自动释放掉为该栈所分配的空间,在栈中,对应着一个栈帧的出栈。虚拟机会自动分配与回收内存,因此效率比较高。
三、总结 最后做一下栈的总结:
存放基本类型变量,局部变量,对象的引用;
系统自动分配与回收内存,效率较高,快速,存取速度比堆要快;
是一块连续的内存的区域,有大小限制,如果超过了就会栈溢出,并抛出栈溢出的异常stackoverflowerror;
java会自动释放掉为该变量所分配的内存空间;
栈又分为java栈和本地方法栈。顾名思义,本地方法栈自然就是为本地方法提供服务的,java栈是为java服务的。
注意⚠️:jvm栈是每个线程私有的!
四、拓展阅读 《jvm虚拟机专栏》


一文详细了解ArkUI框架新增能力
联想乐檬K3和红米2哪个最好
“景东120m脉冲星射电望远镜(JRT)研制”启动仪式成功举行
特斯拉欲在夏威夷部署世界上最大的电池系统 将为夏威夷这个洲直接供电
逆变器开不了机的原因 逆变器不输出高压怎么修 逆变器输出电压不足220v
JVM进阶知识(一):初识 JAVA 栈
5G干扰问题与分析方法
中国钢丝绳标准
GaN氮化镓材料,主要适用于哪些领域
基于深度学习的新一代智能隐身器件
南方电网正在策划实施四类项目来推动公司高质量发展
硅光调制器的带宽极限是多少?
TCS208F新型热导传感器
聚焦五大关健领域技术 展示智慧城市服务物联网方案
多核处理器实时控制性能的介绍
iPhone12系列手机的优缺点分析
基于ADI ADAU1452 车载音视频高保真方案
详解无线传感器网络的结构和技术要点
5G时代定义了三大场景:eMBB、URLLC、mMTC
移动游戏产业促进互联网市场发展