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

发布于:2022-12-24 ⋅ 阅读:(407) ⋅ 点赞:(0)

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),另一种是抛出异常。

        

本文含有隐藏内容,请 开通VIP 后查看