• Jvm_栈


    JVM栈描述

            

           oracle官网JVM描述地址 : https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.6

           根据官网描述 , 栈分为 : 本地方法栈 和 java虚拟机栈 , 此处我们仅描述java虚拟机栈

            

           栈描述官网截图 :

             

                 特点  :

                 1. 随着线程的创建而创建,非线程共享的.

                 2. java虚拟机的栈中存储的都是一个个栈帧. (每调用一个方法就会存入一个栈帧) , 当栈帧的个数超出虚拟机限定时, 会抛出 StackOverflowError.

                 3. 栈和堆一样,都是可以动态分配的,java虚拟机没有空间为线程开辟栈时,同样会报出 OutofMemoryError的错误

                 4.栈作为一种数据结构,先进后出

                  作为一种体现:  线程开启,先调用 PersonController的 QueryOne()方法, QueryOne()方法中调用了 QueryTwo()方法, QueryTwo()中调用了QueryThree()方法,那么先后压入栈的方法是 QueryOne(), QueryTwo() , QueryThree() ,按照我们的认知,肯定是 QueryThree() 执行结束, QueryTwo()拿到 QueryThree()的返回值,继续执行, 执行结束后 ,QueryOne()拿到 QueryTwo()的方法返回值,继续执行,直至执行结束,Response返回.这样的话栈中弹出3个方法(栈帧)的顺序是 QueryThree() ,QueryTwo() 和 QueryOne() , 与压入顺序是相反的.

                 5. 方法中的局部变量形参都是存储在栈中的.指向了堆中的对象实例. final修饰的自定义对象 如 : final Person person = new Person(),只表示地址值不可变,里面属性是可以随意set的.这个实例也是同样存储在堆中的.

         栈帧描述官网截图 :

        栈帧描述 : 

                 1. 每调用一个方法,就会往栈中压入一个栈帧.

                 2. 栈帧分为 : 操作数栈 , 局部变量表 , 动态链接 , 正常返回和异常返回

             3.

    每个栈帧都包含一个执行运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)

    Class 文件中存放了大量的符号引用,字节码中的方法调用指令就是以常量池中指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。另一部分将在每一次运行期间转化为直接引用,这部分称为动态连接。

        举例 : 有一部分是真正运行起来,才知道具体引用了哪个对象,无法在编译器就直接转为直接引用. 如java的多态,开发者均采用父类来接收返回值.但在运行时,真正获取的的可能是重写了父方法的子类.



     

           

    人总得做点什么 ,不是么
  • 相关阅读:
    《剑指offer》— JavaScript(1)二维数组中的查找
    《JavaScript高级程序设计(第三版)》-3
    HTML+CSS基础
    HTML5新增属性
    《javascript高级程序设计(第3版)》-1
    wp8.1 Study7: ListView 和GridView应用
    wp8.1 Study6: App的生命周期管理
    WP8.1 Study5:Data binding数据绑定
    WP8.1 Study4:WP8.1中控件集合应用
    WP8.1 Study3:WP8.1中Animation应用
  • 原文地址:https://www.cnblogs.com/liweibing/p/12674345.html
Copyright © 2020-2023  润新知