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内部的时候,如果被调用的目标方法在编译期可知,且运行期间保持不变,这种情况下将调用方法的符号引用转换位直接引用的过程称为静态链接。

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

瑞芯微 | I2S-音频基础 -1

最近调试音频驱动,顺便整理学习了一下i2s、alsa相关知识,整理成了几篇文章,后续会陆续更新。 喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。 1. 音频常用术语 名称含义ADC(Analog to Digit Conversion)模拟信号转换…

TCP重传机制、滑动窗口、拥塞控制

一、总述 TCP,Transmission Control Protocol,是一个面向连接、基于流式传输的可靠传输协议,考虑到的内容很多,比如数据包的丢失、损坏、分片和乱序等,TCP协议通过多种不同的机制来实现可靠传输。今天,重点…

代码随想录算法训练营第三十九天|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 题解&…

基于YOLOv5的无人机视角水稻杂草识别检测

💡💡💡本文主要内容:详细介绍了无人机视角水稻杂草识别检测整个过程,从数据集到训练模型到结果可视化分析。 博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点…

探讨2024年AI辅助研发的趋势

一、引言 随着科技的飞速发展,人工智能(AI)已经成为当今时代最具变革性的技术之一。AI的广泛应用正在重塑各行各业,其中,AI辅助研发作为科技和工业领域的一大创新热点,正引领着研发模式的深刻变革。从医药…

用WSGI发布flask到centos7.9

起因 想把自己的Flask或者Django网站,发布到服务器上,让大家都可以访问。网上搜的结果,要么是用NginxuWSGI,要么是用NginxGunicorn。大名鼎鼎的Nginx我早有耳闻,那么两位俩玩意是啥呢。 WSGI是什么 uwsgi是Nginx和w…

用pyqt5实现的滑动开关(有动画效果)

1、效果展示 2、控件源码 import sys from PyQt5.QtCore import Qt, QRect, QPoint, QVariantAnimation from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayoutclass SwitchButton(QWidget):def __init__(self, parent=N…

华为设备小型园区网方案(有线+无线+防火墙)

(一)配置有线部分 1.配置LSW2 (1)创建相关vlan [LSW2]vlan batch 10 3000 (2)配置连接LSW1的Eth-Trunk1,透传VLAN 10 3000 [LSW2]int Eth-Trunk 1 [LSW2-Eth-Trunk1]port link-type trunk [LSW2…

关于Linux上的$ORIGIN解说

1、Linux RPATH & $ORIGIN 许多现代C / C 项目都利用Autotools创建GNU构建系统,例如 根据平台生成make文件。 可执行文件(二进制文件)在生成/编译过程中生成,并且可以在执行编译的计算机上本地执行。 但是,如果将…

centos 系统 yum 无法安装(换国内镜像地下)

centos 系统 yum 因为无法连接到国外的官网而无法安装,问题如下图: 更换阿里镜像,配置文件路径:/etc/yum.repos.d/CentOS-Base.repo(如果目录有多余的文件可以移动到子目录,以免造成影响) bas…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论一】

简介: 2014年Ian Goodfellow提出以来,GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起,很多论文都在尝试解决,但是效果不尽人意,比如最有名的一个改进DCGAN依靠的是对…

B端系统优化,可不是换个颜色和图标,看看与大厂系统的差距。

Hi,我是贝格前端工场,优化升级各类管理系统的界面和体验,是我们核心业务之一,欢迎老铁们评论点赞互动,有需求可以私信我们 一、不要被流于表面的需求描述迷惑。 很多人找我们优化系统界面,对需求总是轻描淡…

开源模型应用落地-工具使用篇-Ollama(六)

一、前言 在AI大模型百花齐放的时代,很多人都对新兴技术充满了热情,都想尝试一下。但是,实际上要入门AI技术的门槛非常高。除了需要高端设备,还需要面临复杂的部署和安装过程,这让很多人望而却步。不过,随着…

设计模式大题做题记录

设计模式大题 09年 上半年: 09年下半年 10年上半年 10年下半年 11年上半年 11年下半年 12年上半年 12年下半年 13年上半年 13年下半年

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

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

计算机中丢失缺少mfc100.dll文件该如何解决?

当你打开某个应用程序时,有时候会遇到一个“mfc100.dll丢失”或找不到mfc100.dll的错误信息提示。这种情况表明你的计算机缺少一个名为mfc100.dll的动态链接库文件。这个文件是由Microsoft VC 2010 Redistributable Package提供的,它是一组可重用的组件&…

普通专线维护成本太高?不如试试SD-WAN专线

企业数字化转型的加速,对于网络连接的需求变得越来越迫切。然而,传统的普通专线维护成本高、部署周期长等问题逐渐凸显,而SD-WAN(软件定义广域网)专线却因其灵活性和成本效益而备受关注。本文将探讨普通专线和SD-WAN专…

idea2023和历史版本的下载

1.idea中文官网 idea官网历史版本下载(https://www.jetbrains.com.cn/idea/download/other.html)

配置与管理NFS服务器

配置与管理NFS服务器 NFS:即网络文件系统,只提供网络文件共享,不提供数据传输 作用:可以是用户在异构网络操作系统之间进行文件系统共享 概述:客户机与服务器之间可以共享文件,但不可数据传输功能&#…

蓝桥杯-最长递增

思路及代码详解:(此题为容易题) #include <iostream> using namespace std; int main() {int a[1000]{0};int n,temp;int num0;int count0;cin>>n;for(int i0;i<n;i){cin>>a[i];}//输入数据tempa[0];//设置一个临时比较的存储变量for(int i1;i<n;i){i…