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


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

            

  • 相关阅读:
    轻松省钱赚佣金:微信返利机器人的制作教程
    2021中国科学院文献情报中心期刊分区表 计算机(2)
    视频号视频提取小程序,快速下载视频号视频
    ERC-3525 通过倒计时 SFT 是什么?有什么用?
    不同优化器的应用
    Python学习 day03(注意事项)
    H.265流媒体播放器EasyPlayer.js集成时页面报错出现“X”,该如何解决?
    华为OD机考:0039-0040:url地址、序列描述
    启发式搜索: A*算法
    React + 项目(从基础到实战) -- 第八期
  • 原文地址:https://blog.csdn.net/a2321123/article/details/126492082