操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。可把操作数栈理解为存储计算时,临时数据的存储区域。下面我们通过一段简短的程序片段外加一幅图片来了解下操作数栈的作用。

int a = 100;

int b = 98;

int c = a+b;

从图中可以得出:操作数栈其实就是个临时数据存储区域,它是通过入栈和出栈来进行操作的。

帧数据区除了局部变量区和操作数栈外,Java栈帧还需要一些数据来支持常量池解析、正常方法返回以及异常派发机制。这些数据都保存在Java栈帧的帧数据区中。

当JVM执行到需要常量池数据的指令时,它都会通过帧数据区中指向常量池的指针来访问它。

除了处理常量池解析外,帧里的数据还要处理Java方法的正常结束和异常终止。如果是通过return正常结束,则当前栈帧从Java栈中弹出,恢复发起调用的方法的栈。如果方法又返回值,JVM会把返回值压入到发起调用方法的操作数栈。

为了处理Java方法中的异常情况,帧数据区还必须保存一个对此方法异常引用表的引用。当异常抛出时,JVM给catch块中的代码。如果没发现,方法立即终止,然后JVM用帧区数据的信息恢复发起调用的方法的帧。然后再发起调用方法的上下文重新抛出同样的异常。

栈的整个结构

在前面就描述过:栈是由栈帧组成,每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,而帧是由局部变量区、操作数栈和帧数据区组成。那在一个代码块中,栈到底是什么形式呢?下面是我从《深入JVM》中摘抄的一个例子,大家可以看看:

代码片段:

执行过程中的三个快照:

上面所给的图,只想说明两件事情,我们也可用此来理解Java中的栈:

1、只有在调用一个方法时,才为当前栈分配一个帧,然后将该帧压入栈。

2、帧中存储了对应方法的局部数据,方法执行完,对应的帧则从栈中弹出,并把返回结果存储在调用方法的帧的操作数栈中。

22/2<12

java 栈的变量_深入Java核心:JVM中的栈和局部变量相关推荐

  1. java设置系统环境变量_设置java 环境变量

    DOS下任意目录用JAVA,JAVAC肯定是显示正确咯,因为你设置好了JAVAlib和bin的但是JAVA文件需要DOS下CD好了目录才能JAVAC否则是在C:\program里查找该JAVA文件你任 ...

  2. java 易变变量_提高java编程质量 - (一)易变业务使用脚本语言编写

    脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型: 2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务 3.简单:脚本语言语 ...

  3. java 易变变量_关于java:易变变量和其他变量

    以下是经典Concurency in Practice的内容: When thread A writes to a volatile variable and subsequently thread ...

  4. java string hash变量_聊聊 Java 中 HashMap 初始化的另一种方式

    如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的"臃肿.啰嗦"的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型.复杂项目的理由之一 ...

  5. java使用外部库_在Java中使用外部库

    java使用外部库 Java附带了一组核心库,其中包括定义常用数据类型和相关行为的库,例如String或Date : 与主机操作系统进行交互的实用程序,例如System或File : 有用的子系统来管 ...

  6. java的jmm模型_【深入理解JVM】:Java内存模型JMM

    多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...

  7. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  8. 头歌(educoder)第 1 章 Java入门之变量与表达式 Java入门 - 运算符和表达式

    educoder(头歌)第 1 章 Java入门之变量与表达式 Java入门 - 运算符和表达式 第1关:算数运算符 package step1; import java.util.Scanner;p ...

  9. JVM中的栈和局部变量

    JVM中的栈和局部变量 Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的.可以看出栈在Java核心的重要位置.今天我们就继续深入Java核心这个系列, ...

最新文章

  1. 最大全0/1子矩阵的探究
  2. mybatis清除一级缓存的几种方法
  3. Visual Studio 中Debug模式和Release模式的区别
  4. spring boot的多环境部署
  5. 五种方法,教你如何在Mac上查看文件完整路径
  6. RxJS的另外四种实现方式(一)——代码最小的库
  7. 5 simple types and 6 false values in JavaScript
  8. 23中设计模式之简单工厂模式
  9. php中session总结,PHP中SESSION使用中的一点经验总结
  10. 随机样例生成器(外观优化)
  11. python语法总结
  12. PeopleCert认证证书核验真伪(含ITIL、PRINCE2、DevOps、Scrum……等证书)
  13. 无线模块发送接收笔记
  14. 数据库系统原理与应用教程(041)—— MySQL 查询(三):设置查询条件
  15. 使用SSH密钥连接阿里云linux服务器
  16. 一个简单有趣的爬虫-----爬取百度翻译功能
  17. ios沙箱模式开启_IOS沙盒基本机制(sandbox)
  18. 声源定位系统设计(一)——MVDR波束形成算法
  19. Suricata高性能配置
  20. 阿里微服务大牛奉命总结出500页Spring微服务架构笔记

热门文章

  1. 游戏开发中常用的设计模式
  2. BZOJ4278 : [ONTAK2015]Tasowanie
  3. [禅悟人生]谦虚有助于自我消融
  4. iOS开发之MapKit
  5. [转载]一个发生在亚洲服务器上的真实故事!
  6. Python+tkinter实现验证码输入和切换
  7. Python根据字符分组数量判断密码安全强度
  8. python 输入列表 返回每个元素出现的次数
  9. qt qthead里如何响应信号_QT使用教程(五)之程序编写
  10. 力扣编辑距离系列问题总结