JVM-虚拟机栈概述

a6d03e261a684f4f9060cc4bd1c19334.jpg

 

背景:由于跨平台的设计,java指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器。

栈是运行时单位,而堆是存储的单位。即:栈解决程序运行的问题,即程序如何执行,或者说如何处理数据,堆解决是数据存储的问题,即数据怎么放,放在哪。

栈中可能出现的异常:java栈的大小可以是动态的也可以是固定不变的。

如果采用固定大小的虚拟机栈,那么如果线程请求超过栈容量,会出现StackOverflowError异常。

如果java虚拟机可以动态扩展,当无法申请扩展到足够的内存的时候,会抛出OOM(OutOfMemoryError)异常。

栈的运行原理:

JVM直接堆Java栈的操作只有两个,就是入栈和出栈,遵循先进后出的原则,所以没有GC(垃圾回收)。

java栈中存储的数据是栈帧,一个活动线程的一个时间点上只有一个活动的栈帧,如果在方法中调用了其他方法,那么新的栈帧会被创建出来,放在栈的顶端,成为新的栈帧。

不同线程中所包含的栈帧是不允许存在相互引用的,即不可能在一个栈帧之中引用另外一个线程的栈帧。

如果当前方法调用了其他方法,方法返回时,当前栈帧会传回此方法的执行结果给前一个栈帧,接着虚拟机会丢弃当前栈帧,使得前一个栈帧重新称为当前栈帧。

java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另外一种是抛出异常,不管哪一种方式,都会导致栈帧被弹出。

栈的内部结构:

1)局部变量表

2)操作数栈

3)动态链接

4)方法返回地址

5)一些附加信息

2 局部变量表

定义为一个数字数字,主要用于存储方法参数和定义在方法体内的局部变量。

因为时定义在线程私有的虚拟机栈上,所以很多时候不存在线程安全问题(当局部变量作为函数参数传递一点点牵强)、作为函数返回值时会出现线程安全问题)。

局部变量表所需的容量大小是在编译期间确定下来的,并保存在方法的Code 属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小。

局部变量表中的变量只在当前方法调用中有效,在方法执行时,虚拟机通过局部变量表完成参数值到参数变量列表的传递过程。在方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁

Slot:

局部变量表的最基本的存储单元就是slot(槽)

在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型)-存储的时候都是以int类型存储,64位的类型(long和double)占用两个slot。

jvm会为局部变量中每一个slot都分配一个访问索引,通过整访问索引可以成功范文到局部变量表中指定的局部变量

如果当前帧时由构造方法或者实例方法创建的(非静态方法),那么该对象的引用this将会存放在index为0的slot处。

 

slot的 重复利用:

栈帧中的局部变量表中的槽位时可以重复利用的,如果一个局部变量过了其作用域(如类里面的代码块),后面申请的局部变量就可能重复利用过期的局部变量的槽位。

 

局部变量与静态变量的对比:

静态变量的初始化有两个阶段,第一次是在准备阶段,会对其分配存储空间和默认的初始化值,第二次是在初始化阶段,赋予程序员在代码中定义的初始值。

局部变量不存在系统初始化的过程,所以一旦定义,必须认为进行初始化,不然无法使用。

3 操作数栈

操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据。主要用于保存计算结果过程的中间结果,同时作为计算过程中的变量临时的存储空间。

操作数栈中可以存储任意类似的java数据,32bit的类型占用一个栈单位深度,64位的类型占用两个栈单位深度。

如果调用的方法带有返回值,其返回值会被压入当前栈帧的操作数据栈中,并更新PC寄存器中下一条需要执行的字节码指令。

java虚拟机的解释引擎是基于栈的执行引擎,其中的栈就是操作数栈

4 动态链接

每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属的方法的引用。包含这个引用的目的就是支持当前方法的代码能够实现动态链接。比如invokedynamic指令。java属于静态语言,是判断变量本身类型信息,java8中lambda的出现,invokedynamic指令的生成,使得java有了直接生成的方式,有了一个动态语言的特性。

在java源文件被编译到字节码文件中时,所有变量和方法引用都作为符号引用保存在class文件的常量池里,动态链接就是为了将这些符号引用转换位调用方法的直接引用。

5 方法调用

在jvm中,将符号引用转换位调用方法的直接引用与方法的绑定机制相关。

静态链接:当一个字节码文件被装入jvm内部的时候,如果被调用的目标方法在编译期可知,且运行期间保持不变,这种情况下将调用方法的符号引用转换位直接引用的过程称为静态链接。

动态链接:如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期间将调用方法的符号引用转化位直接引用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/271868.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js【详解】event loop(事件循环/事件轮询)

event loop 是异步回调的实现原理 js 代码的执行过程 从前到后,一行一行执行如果某一行执行报错,则停止下面代码的执行先把同步代码执行完,再执行异步 event loop 图解 以下方代码为例: 第1步 将第 1 行代码放入调用栈 将要执行第…

Qt初识 - 编写Hello World的两种方式 | 对象树

目录 一、通过图形化方式,在界面上创建出一个控件 二、通过代码方式,创建Hello World 三、Qt 内存泄漏问题 (一) 对象树 一、通过图形化方式,在界面上创建出一个控件 创建项目后,打开双击forms文件夹中的ui文件,可…

几种常见的python开发工具

​ Python是一种功能强大且易于学习的编程语言,被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛,越来越多的Python开发工具也涌现出来。但是,对于新手来说,选择一款合适的Python开发工具可…

Flutter使用auto_updater实现windows/mac桌面应用版本升级功能

因为windows应用一般大家都是从网上下载的,后期版本肯定会更新,那用flutter开发windows应用,怎么实现应用内版本更新功能了?可以使用auto_updater库, 这个插件允许 Flutter 桌面 应用自动更新自己 (基于 sparkle 和 wi…

贝叶斯优化BiLSTM分类预测(matlab代码)

贝叶斯优化BiLSTM分类matlab代码 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试集,比例为8:1:1 数据处理: 在数据加载后,对数据进行了划分,包括训练集、验证集和测试集,这有助于评估模型的泛化能力。 数据标…

js 实现点击按钮小球加入购物车动画

本文旨在实现类似点击按钮实现小球加入购物车效果。 使用技术: Vue2使用 Pubsub 监听按钮点击事件(如果不想用也可以自己改造下)监听 onmousemove 来获取按钮点击时的鼠标位置 小球组件: html css: 小球父元素&am…

智慧城市中的数字孪生:构建城市管理的未来框架

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、实时监测与预警 2、模拟与优化 3、智能化决策 4、协同与共享 四、数字孪生技术构建城市管理的未来框架的价值 1、提高管理效率 2、优化资源配置 3、提升公共服务水平 4、增强应对突发事…

VS配置开发与远程调试笔记

先简单写一下,后续详细补充 场景:本地机器开发,虚拟机调试 准备工作: 由于要将生成的文件生成在虚拟机,避免反复拷贝,直接配置虚拟机共享文件夹进行写入,步骤如下: 虚拟机打开网…

设计模式(十四)中介者模式

请直接看原文: 原文链接:设计模式(十四)中介者模式_设计模式之中介模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 前言 写了很多篇设计模式的…

代理模式以及静态代理、JDK代理、Cglib代理的实现

代理模式(Proxy) 介绍 1、代理模式:为对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作 &…

java-ssm-jsp-大学生互动交流网站设计与实现

java-ssm-jsp-大学生互动交流网站设计与实现 获取源码——》公主号:计算机专业毕设大全

Linux运维:实现光盘开机自动挂载、配置本地yum源教程

Linux运维:实现光盘开机自动挂载、配置本地yum源教程 一、光盘开机自动挂载1、检查光驱设备2、创建挂载点3、编辑/etc/fstab文件4、测试挂载 二、配置本地yum源(挂载光盘或ISO文件)1、挂载ISO文件2、创建YUM仓库配置文件3、清理YUM缓存并测试 💖The Begi…

数据结构——lesson7二叉树 堆的介绍与实现

前言💞💞 啦啦啦~这里是土土数据结构学习笔记🥳🥳 💥个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 💥对于数据结构顺序表链表有疑问的都可以在上面数据结…

python的虚拟环境

python的虚拟环境可以为项目创建一个独立的环境,能够解决使用不同版本依赖给项目带来冲突的麻烦。创建虚拟环境的方式有很多种,pipenv会自动帮你管理虚拟环境和依赖文件,并且提供了一系列命令和选项来帮忙你实现各种依赖和环境管理相关的操作…

代码随想录算法训练营第三十九天|62.不同路径、63. 不同路径 II

62.不同路径 刷题https://leetcode.cn/problems/unique-paths/description/文章讲解https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html视频讲解https://www.bilibili.com/video/BV1ve4y1x7Eu/?vd_sourceaf4853e80f89e28094a5fe1e220d9062 题解&…

储能系统---交流充电桩(三)

一、充电模式及其功能要求 关注公众号 --- 小Q下午茶 新国标在标准 GB/T 18487.1-2015《电动汽车传导充电系统 第1部分:通用要求》中规定了 4 种充电模式,下面将对这 4 种充电模式及其功能要求进行介绍。 1.1 、模式 1 模式 1 是指在充电系统中应使用…

3D数字孪生运行不起来?该检查你的电脑配置了

运行3D数字孪生项目通常需要一定的计算资源和图形处理能力。以下是一些常见的电脑配置要求,可以作为参考:1处理器(CPU):推荐使用多核心处理器,如Intel Core i7或更高级别的处理器。较高的时钟频率和较大的缓…

使用 Docker 部署 File Browser 文件管理系统

1)File Browser 介绍 官网:https://filebrowser.org/ GitHub:https://github.com/filebrowser/filebrowser 今天为大家分享一款开源的私有云盘项目:File Browser,简单实用、轻量级、跨平台,安装部署简单快…

CMake笔记

CMake笔记 文章目录 CMake笔记1 工程项目一般形式2 常见命令2.1 project2.2 set2.3 message2.4 add_executable()2.5 语法原则2.6 add_subdirectory2.7 add_library2.8 list 3 安装3.1 安装.h文件/文本文件3.2 安装工程脚本3.3 安装目录/目录下内容3.4 安装库文件3.5安装过程 4…

AI大模型,掀起新一波智能浪潮!

AI大模型的出现,标志着人工智能技术迈入了一个新的阶段。这些巨大的模型不仅在规模上超越了以往任何其他人工智能系统,而且在性能上也取得了巨大的突破。由于其庞大的参数量和复杂的结构,AI大模型在各个领域展现出了强大的学习能力和推理能力…