JVM栈与堆(一)之栈和栈中单位栈帧

7 篇文章 0 订阅
本文详细介绍了Java虚拟机栈的作用和特性,包括每个线程的私有虚拟机栈、栈帧的运作以及可能出现的StackOverflowError和OutOfMemoryError异常。栈主要负责Java程序的运行,存储局部变量、对象引用和部分结果。栈帧是方法调用的内存区块,保存执行过程中的数据。栈的高效访问速度和无垃圾回收特性使其在内存管理中扮演关键角色。
摘要由CSDN通过智能技术生成

1.内存中的栈与堆

        栈是运行时的单位(所解决的是运行问题,操作程序的执行)

        堆是存储的单位(所解决的是数据存储问题,主要管数据的方法(怎么放,放在哪))

2.Java虚拟机栈

        2.1 java虚拟机栈是什么?

                每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用。是线程私有的。

        2.2 生命周期

                生命周期和线程一致,随着线程的创建而创建,随着线程的销毁而销毁

        2.3 作用

                主管Java程序的运行,它保存方法的局部变量(8个基本数据类型(表1),对象的引用地址)、部分结果,并参与方法的调用和返回。

Java中八个基本数据类型
整型byte、short、int、long
字符型char
浮点型float、double
布尔型boolean

                                                                           表1

        2.4栈的特点

                栈是一种有效的分配存储方式,访问速度仅次于程序计数器。(因为它所涉及到的只有出栈和进栈以及执行结束后的出栈工作),同时对于栈来说,不存在垃圾回收问题,因为他就会出栈来排除垃圾。

        2.5 栈中可能出现的异常

        上面说到栈不会存在垃圾回收问题。但是它会出现其他问题。

        Java虚拟机规范允许Java栈的大小动态或者固定的,如果采用固定的方法,当线程请求分配的虚拟机栈大于虚拟机栈允许的最大容量,Java虚拟机就会抛出StackOverflowError异常。如果Java虚拟机栈可以动态扩展,当尝试扩展时,无法申请到足够的内存。或者创建新的线程时没有足够的内存去创建对应的虚拟机,那Java虚拟机将会抛出OutOfMemoryError异常。

        2.6 栈帧

        没有线程都有对应的栈,而栈中的数据都是以栈帧的格式存在的,在线程中执行的每个方法都对应着一个栈帧,栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息。

       JAVA虚拟机中的栈只有两个操作,就是进栈和出栈。这样在某一时间,只会有一个栈帧在运行,这个栈帧就是当前栈帧,那么栈帧对应的方法就是当前方法,方法对应定义的类,就是当前类。执行引擎内所有的字节码指令都是针对当前栈帧的,如果该方法调用其它方法,就会把其他方法作为新的栈帧放入栈帧,变为当前栈帧。

        不同线程之间的栈帧是不能相互引用的,同时当前方法执行的结果会给下一个栈帧,然后虚拟机丢弃当前栈帧,JAVA中有两种返回方式,一种是正常返回(return),另一种是抛出异常。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱分享的小邓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值