JVM之Java栈Java stack

╰+哭是因爲堅強的太久メ 2022-01-31 01:57 327阅读 0赞

JVM之Java栈Java stack


目录:

  1. JVM体系结构概览
  2. JVM之Java栈解析

1. JVM体系结构概览


在这里插入图片描述


2. JVM之Java栈解析


stack图

在这里插入图片描述

先简单认识,图示在一个栈中有两个栈帧:
  1. 栈帧 2是最先被调用的方法,先入栈,然后方法 2 又调用了方法1。
  2. 栈帧 1处于栈顶的位置,栈帧 2 处于栈底,执行完毕后,依次弹出栈帧 1和栈帧 2,线程结束,栈释放。
  3. 每执行一个方法都会产生一个栈帧,保存到栈(后进先出)的顶部,顶部栈就是当前的方法,该方法执行完毕 后会自动将此栈帧出栈。

解析:

(1)Stack 栈是什么

  1. 栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。
  2. 8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。

(2)栈存储什么?

栈帧中主要保存3 类数据:

  1. 本地变量(Local Variables):输入参数和输出参数以及方法内的变量;
  2. 栈操作(Operand Stack):记录出栈、入栈的操作;
  3. 栈帧数据(Frame Data):包括类文件、方法等等。

(3) 栈运行原理:

  1. 栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧 F1,并被压入到栈中,
    A方法又调用了 B方法,于是产生栈帧 F2 也被压入栈,
    B方法又调用了 C方法,于是产生栈帧 F3 也被压入栈,
    ……
    执行完毕后,先弹出F3栈帧,再弹出F2栈帧,再弹出F1栈帧……
  2. 遵循“先进后出”/“后进先出”原则。
    每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。栈的大小和具体JVM的实现有关,通常在256K~756K之间。

(4) 栈+堆+方法区的交互关系

在这里插入图片描述

  • HotSpot是使用指针的方式来访问对象:
    Java堆中会存放访问类元数据的地址,
    reference存储的就直接是对象的地址

补充引用: Java栈,PC寄存器,本地方法栈,堆,方法区和运行常量池

Java栈

  1. Java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,基本数据类型的数据,和对象的引用(reference)。
  2. 驻留于常规RAM(随机访问存储器)区域。但可通过它的“栈指针”获取处理的直接支持。栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在栈里——特别是对象句柄,但Java对象并不放到其中。
  3. JVM只会直接对JavaStack(Java栈)执行两种操作:①以帧为单位的压栈或出栈;②通过-Xss来设置, 若不够会抛出StackOverflowError异常。
  4. 每个线程包含一个栈区,栈中只保存基本数据类型的数据和自定义对象的引用(不是对象),对象都存放在堆区中
  5. 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  6. 栈分为3个部分:基本数据类型的变量区、执行环境上下文、操作指令区(存放操作指令)。
  7. 栈是存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息,Java栈所占内存的大小由Xss来调节,方法调用层次太多会撑爆这个区域。

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,327人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaStack

    当我们目空所极,认为望穿一切时,我们才发现我们是多么的可悲的井底之蛙。有些java学者,认为自己已经把java学的出神入化了,这本身就是一种多么可悲的自大啊,在你用到的,你或许

    相关 java (Stack)类

    栈(Stack)类: 栈是向量的一个子类,它实现了一个标准的后进先出的栈。 堆栈只定义了默认函数,用来创建一个空栈。堆栈除了包括由Vector定义的所有方法,也定义了自己的

    相关 JVM--Stack

    栈(Stack) 栈也叫栈内存,主管java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题, 只要线程