当前位置: 首页 > 编程日记 > 正文

java虚拟机栈帧_Java虚拟机,运行时栈帧结构

5dd4e594ca1b353aca978b6ee79ce105.png

业余生活要有意义,不要越轨。——华盛顿

引导语

“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的。

在《Java虚拟机规范》中制定了Java虚拟机字节码执行引擎的概念模型,这个概念模型成为各大发行商的Java虚拟机执行引擎的统一外观。

从外观上来看,所有的Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果。

1 运行时栈帧结构

栈帧,是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈的栈元素。

栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。

每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

一个栈帧需要分配多少内存,并不会受到程序运行期变量数据的影响,而仅仅取决于程序源码和具体的虚拟机实现的栈内存布局形式。

对于执行引擎来讲,在活动线程中,只有位于栈顶的方法才是在运行的,只有位于栈顶的栈帧才是生效的,其被称为“当前栈帧”,与这个栈帧所关联的方法被称为“当前方法”。执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作。

虚拟机栈和栈帧的总体结构,如图:

8a58eecc36eed8fa065fbb27531bac90.png

2 局部变量表

局部变量表是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量。

在Java程序被编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的最大容量。

这里说下reference类型,它表示对一个对象实例的引用。一般来说,虚拟机实现通过这个引用做到:

①从根据引用直接或间接地查找到对象在Java堆中的数据存放的起始地址或索引。

②根据引用直接或间接地查找到对象所属数据类型在方法区中的存储的类型信息

由于局部变量表是建立在线程堆栈中的,属于线程私有的数据,无论读写两个连续的变量槽是否为原子操作,都不会引起数据竞争和线程安全问题。

Java虚拟机通过索引定位的方式使用局部变量表,索引值的范围是从0开始至局部变量表最大的变量槽数量。

当一个方法被调用时,Java虚拟机会使用局部变量表来完成参数值到参数变量列表的传递过程,即实参到形参的传递。

为了尽可能节省栈帧耗用的内存空间,局部变量表中的变量槽是可以重用的,方法体中定义的变量,其作用域并不一定会覆盖整个方法体,如果当前字节码PC计数器的值已经超出了某个变量的作用域,那这个变量对应的变量槽就可以交给其他变量来重用。

推荐编码规则:

a. 不使用的对象应手动赋值为null。(从编码角度讲,以恰当的变量作用域来控制变量回收时间才是最优雅的解决方法;从执行角度来讲,使用赋null操作来优化内存回收是建立在对字节码执行引擎概念模型的理解之上的)

b. 如果一个局部变量定义了但没有赋初始值,那它是完全不能使用的。所以不要认为Java中任何情况下都存在诸如整型变量默认为0、布尔型变量默认为false等这样的默认值规则。

3 操作(数)栈

操作数栈是一个后入先出(LIFO)栈。操作数栈的最大深度也在编译的时候被写入到Code属性的max_stacks数据项之中。

当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈和入栈操作。

两个栈帧之间的数据共享:

21e0960ff76152dcc913d4451cfaf864.png

4 动态连接

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

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

5 方法返回地址

当一个方法开始执行后,只有两种方式退出这个方法。

正常调用完成:执行引擎遇到任意一个方法返回的字节码指令。

异常调用完成:在方法执行的过程中遇到了异常,并且这个异常没有在方法体内得到妥善处理。

一个方法使用异常完成出口的方式退出,是不会给它的上层调用者提供任何返回值的。

一般来说,方法正常退出时,主调方法的PC计数器的值就可以作为返回地址,栈帧中很可能会保存这个计数器值。而方法异常退出时,返回地址是要通过异常处理器表来确定的,栈帧中就一般不会保存这部分信息。

3a5baaac8838b92ddf2b912570250ab0.png

相关文章:

深入浅出Pytorch:01 课程大纲与PyTorch简介

深入浅出Pytorch 01 课程大纲与PyTorch简介 内容属性:深度学习(实践)专题航路开辟者:李嘉骐、牛志康、刘洋、陈安东领航员:叶志雄航海士:李嘉骐、牛志康、刘洋、陈安东开源内容:https://githu…

用C写有面向对象特点的程序

比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后&a…

[置顶] 单键模式的C++描述

设计模式-单键(Signelton):其实单键的设计模式说来很简单,说的直白一点就是程序运行过程中保证只有一个实例在运行而已。在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑…

下java7 64有什么用_Win 7 64位系统安装java 8,看完就明白了

在 Windows 7 的 64 位系统中安装 jdk 8工具/材料Windows 7 64 位系统JDK 8 64位版本方法/步骤1 下载JDK 8安装文件011.1 访问JDK下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html点击 JDK Download 按钮,进入JDK下载页。021.2 下载JDK…

微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍...

在SSDT中部署一个 SSAS 项目到本地服务器上出现错误。 You cannot deploy the model because the localhost deployment server is not running in multidimensional mode。 错误原因是因为我在本地安装 SQL Server 2012 的时候只选择安装了 Tabular Mode,而这个Dem…

java遍历的优化

说明&#xff1a;这是在面试中面试官出的题。虽然是常见的优化问题&#xff0c;但这种经验的确很有用。感慨之余&#xff0c;分享出来&#xff0c;以此共勉。 场景&#xff1a;现有List<PersonA>,List<PersonB>,PersonA 的属性是 String类型的身份证号&#xff0c;…

深入浅出Pytorch:02 PyTorch基础知识

深入浅出Pytorch 02 PyTorch基础知识 内容属性&#xff1a;深度学习&#xff08;实践&#xff09;专题航路开辟者&#xff1a;李嘉骐、牛志康、刘洋、陈安东领航员&#xff1a;叶志雄航海士&#xff1a;李嘉骐、牛志康、刘洋、陈安东开源内容&#xff1a;https://github.com/…

java for 两个条件_for循环条件里定义2个变量为什么会报错

public class HelloWorld {//完成 main 方法public static void main(String[] args) {int scores[]{89,-23,64,91,119,52,73};HelloWorld hellonew HelloWorld();hello.sortScore(scores);}//定义方法完成成绩排序并输出前三名的功能public void sortScore(int[] scores){Arra…

Qt4在linux下的安装

1、下载SDK ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.troll.no/QT/qtsdk/qt-sdk-linux-x86-opensource-2010.05.1.bin 2、修改文件权限 想要安装SDK&#xff0c;需要拥有对其读写和执行的权限。可以通过【右键】->【属性】->【权限】进行设置。 也可以通过命…

高性能千万级定时任务管理服务forsun使用详解

Forsun高性能高精度定时服务&#xff0c;轻松管理千万级定时任务。项目地址&#xff1a; https://github.com/snower/forsun 使用 linux 系统定时器提供精确到秒级的定时调度&#xff0c;长时间运行保证无误差。支持本地内存存储和 redis 持久化存储&#xff0c;使用 redis 可轻…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 11. 贝叶斯分类器

吃瓜教程——西瓜书南瓜书 Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 内容属性&#xff1a;机器学习&#xff08;理…

java 上传的图片大小为0_JAVA技术:上传图片的缩放处理

图片上传到后&#xff0c;会根据情况将图片缩小成一个图标&#xff0c;我们可以利用java强大的图形处理功能&#xff0c;对上传的图片进行缩放处理。下面的程序使用jdk1.4中最新的ImageIO对图片进行读写。使用AffineTransform对图片进行缩放。import java.io.File&#xff1b;i…

信息安全推荐书籍

本页列出了我发现的与计算机安全&#xff0c;数字取证&#xff0c;事件响应&#xff0c;恶意软件分析和逆向工程以及其他相关主题学习主题高度相关和有用的书籍。这些书从介绍性文本到高级研究作品。尽管这些书中的一些看起来有点过时&#xff0c;但所包含的信息对今天学习的人…

paip.odbc DSN的存储与读取

paip.odbc DSN的存储与读取 作者Attilax &#xff0c; EMAIL:1466519819qq.com 来源&#xff1a;attilax的专栏 地址&#xff1a;http://blog.csdn.net/attilax 1.列出系统级ODBC列表 ---------------------- [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data So…

【青少年编程】【三级】计算平均分

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

java 判断是否为邮箱_Java判断邮箱是否存在 有返回值

public static boolean checkEmail(String email) {if (!email.matches("[\\w\\.\\-]([\\w\\-]\\.)[\\w\\-]")) {return false;}String log "";String host "";String hostName email.split("")[1];// 去掉后面的System.out.printl…

Android Handler介绍

本文转自:http://www.cnblogs.com/keyindex/articles/1822463.html前言 学习android一段时间了&#xff0c;为了进一步了解android的应用是如何设计开发的&#xff0c;决定详细研究几个开源的android应用。从一些开源应用中吸收点东西&#xff0c;一边进行量的积累&#xff0c;…

阿里巴巴一年投三家AR公司,AR购物或是最终目标

阿里巴巴再投资AR公司&#xff0c;一年连续投资超2.2亿美元&#xff0c;它到底想要做什么&#xff1f; 最近&#xff0c;以色列AR眼镜厂商Lumus获得来自阿里巴巴的600万美元的投资。此前&#xff0c;镁客网报道过这家公司在去年12月份获得由广达电脑、HTC和盛大集团投资的300万…

青少年编程竞赛交流群周报(第035周)

2021年10月24日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第三十五期直播活动。 一、直播内容 我们直播活动的主要内容如下&#xff1a; 讲解了上次测试中小朋友们做错的题目 Scratch青少年编程能力等级测试模拟题&#xff08;四级&#xff09;。…

java 接口工程_Java工程师(15)抽象类与接口

抽象类思考下面程序潜在的问题交通工具中定义了4个方法&#xff0c;其中行驶方法内部会依次调用启动、加速、停止方法。由于不同的交通工具&#xff0c;启动的方式差异很大&#xff0c;所以交通工具类中并不实现该方法&#xff0c;而是将其交给子类实现。上述代码的问题&#x…

为什么必须是final的呢?

一个谜团 如果你用过类似guava这种“伪函数式编程”风格的library的话&#xff0c;那下面这种风格的代码对你来说应该不陌生&#xff1a; 1 2 3 4 5 6 7 8 9public void tryUsingGuava() {final int expectedLength 4;Iterables.filter(Lists.newArrayList("123", &…

java mvc view_对Springmvc view层的理解

MVC框架可以把应用清晰明了地分为三个部分&#xff1a;Model层–数据层&#xff0c;View层–视图层&#xff0c;Controller–逻辑层&#xff0c;Model层负责整合数据&#xff0c;View层负责页面渲染&#xff0c;Controller层负责实现业务逻辑。我在这里简单说一下我对MVC框架中…

【优秀作业】粒子群算法

粒子群优化算法 一、概述 粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;的思想来源于对鸟捕食行为的模仿&#xff0c;最初&#xff0c;Reynolds.Heppner 等科学家研究的是鸟类飞行的美学和那些能使鸟群同时突然改变方向&#xff0c;分散…

面向对象进阶2 组合

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff1a;命名空间 class Person:Country 中国人 # 静态变量print(Person.Country) alex Person() # 创建了一个空的命名空间 alex.name alex # 对象 alex.Country 泰国人 egon Person() egon.name ego…

Android基础知识之Manifest文件的组织结构

原文&#xff1a;http://android.eoe.cn/topic/android_sdk 是AndroidManifest.xml文件中的根标签&#xff0c;她必须包含一个标签和指定的xmlns:android、 package两个属性。 属性&#xff1a; xmlns:android定义了Android的命名空间。这个属性一般可以设置为&#xff1a;&quo…

java类的注释模板_IDEA添加Java类注释模版的方法

本文介绍了idea添加java类注释模版的方法&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;idea版本&#xff1a;intellij idea 2017.2.5 x64eclipse能在类上方输入/**,回车添加类注释模版&#xff0c;但idea没有默认添加这个功能&#xff0c;需要做一些设置。下面介绍三…

POJ 2586 Y2K Accounting Bug(贪心)

题目连接&#xff1a;http://poj.org/problem?id2586 题意&#xff1a;某公司要统计全年盈利状况&#xff0c;对于每一个月来说&#xff0c;如果盈利则盈利S&#xff0c;如果亏空则亏空D。公司每五个月进行一次统计&#xff0c;全年共统计8次(1-5、2-6、3-7、4-8、5-9、6-10、…

【组队学习】10月份微信图文索引

10月份微信图文索引 一、组队学习相关 周报&#xff1a; Datawhale组队学习周报&#xff08;第036周&#xff09;Datawhale组队学习周报&#xff08;第035周&#xff09;Datawhale组队学习周报&#xff08;第034周&#xff09;Datawhale组队学习周报&#xff08;第033周&…

java spring scope_如何在Spring中自定义scope的方法示例

大家对于 Spring 的 scope 应该都不会默认。所谓 scope&#xff0c;字面理解就是“作用域”、“范围”&#xff0c;如果一个 bean 的 scope 配置为 singleton&#xff0c;则从容器中获取 bean 返回的对象都是相同的&#xff1b;如果 scope 配置为prototype&#xff0c;则每次返…