JVM之Java栈Java stack

本文详细解析了JVM中的Java栈结构与工作原理,包括栈帧的概念、存储的数据类型、运行机制以及与堆、方法区的交互关系。了解Java栈如何管理线程的执行环境,有助于更深入地掌握Java程序的运行机制。

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来调节,方法调用层次太多会撑爆这个区域。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值