JVM-虚拟机栈概述

news2024/12/27 12:05:12

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.coloradmin.cn/o/1501047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

RabbitMQ的web控制端介绍

2.1 web管理界面介绍 connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况channels:通道,建立连接后,会形成通道,消息的投递、获取…

JDK17镜像制作

背景 获取JDK17 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解压JDK tar -zxvf jdk-17_linux-x64_bin.tar.gz 制作JRE 由于jdk的体积比较大,可以使用jre来作为运行环境,jdk1.8及以前版本,自带jre&#…

【center-loss 中心损失函数】 参数与应用

文章目录 前言简单总结一下参数对比解释参数权重衰减(L2正则化)动量其他参数运行 前言 之前我们已经完全弄明白了中心损失函数里的代码是什么意思,并且怎么用的了,现在我们来运行它。 论文:https://ydwen.github.io/…

5. Java内存模型JMM

文章目录 计算机硬件存储体系基于计算机存储结构的 JMM Java 内存模型 JavaMemoryModelJMM规范下的三大特性原子性可见性有序性 多线程对变量的读写过程读取过程 多线程先行发生原则 happens-beforex,y 的 case 说明happens-before 原则说明happens-before 大原则happens-befor…

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

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

数据库原理实验课(1)

目录 实验内容 安装头歌中的相关内容 具体过程 完结撒花~ 我也是第一次接触oracle的相关软件和操作,所以是一次傻瓜式教学记录 实验内容 安装头歌中的相关内容 具体过程 这是我在百度网盘中下载解压出来的oracle文件夹内的全部内容(可能有因为安装完…

C++指针(四)万字图文详解!

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三) 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…

【校园安全】支小蜜防校园霸凌语音识别系统的好处

在校园安全领域,防校园霸凌语音识别系统的出现,为预防和应对校园霸凌行为提供了新的技术手段。本文将探讨防校园霸凌语音识别系统的好处,并分析其在校园安全建设中的重要作用。 通过安装在校园各个角落的语音识别设备,系统能够捕…

LeetCode 刷题 [C++] 第3题.无重复字符的最长子串

题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 题目分析 可以使用滑动窗口加哈希表来实现: 使用start和end两个变脸来表示滑动窗口的头部位置和尾部位置,两者开始均为0;借助哈希表来记录已经遍…

WinSCP下载安装并结合内网穿透实现固定公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计…

走向审计4.0:内部审计数字化转型的路径与方法【文末送书-34】

文章目录 走向审计4.0:内部审计数字化转型的路径与方法一、内部审计的发展阶段二、内部审计的逻辑架构三、内部审计数字化转型面临的问题四、内部审计数字化转型的框架方法五、内部审计的数字化转型能力体系六、内部审计的数字化转型路径七、内部审计的数字化系统平…

Research Agent:具有解决基于大型文本语料库的复杂问题,具备深度多跳推理的能力

原文地址:https://towardsdatascience.com/the-research-agent-4ef8e6f1b741 2023 年 8 月 29 日 问题简介 在2021年,开始应对基于大量文本回答问题的挑战。在预训练transformers之前的时代,这个问题很难破解。 人工智能和大型预训练tran…

143.和弦是什么?和声是什么?三和弦

内容参考于: 三分钟音乐社 上一个内容:142.音程的构唱练习 和弦的定义: 一个音可以把它称为单音 两个音可以把它称为音程 更多的音,通俗的定义上,三个音或者三个以上的音构成的集体就可以叫做和弦,这些音…

Redis进阶(三):主从复制

为了解决单点问题,实现多服务器部署redis,有几种解决方案可以实现:主从复制,主从哨兵还有集群。 何为主从复制 简单来说有三个服务器分别部署了redis-server程序,选中一个服务器当作主节点,其他的就是从节…

TypeScript 哲学 - Object Types

readonly 修饰对象和数组的 双向可分配性是不同的 Combind types 交叉类型对 值类型可以识别 never 但是 Object 类型识别不了 Tuple

AI时代PPT如何制作?用这10款pptai生成器一键制作!

ppt如何制作? 这可能是很多职场人或大学生日常头疼的问题,职场上随便一个工作汇报、提案展示、团队会议,学校里的小组作业、论文答辩等场景,都会用到ppt。 都说人是视觉动物,在两份文档内容质量一致的情况下&#xf…

Qt插件之输入法插件的构建和使用(二)

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

通过对话式人工智能打破语言障碍

「AI突破语言障碍」智能人工智能如何让全球交流无障碍 在当今互联的世界中,跨越语言界限进行交流的能力比以往任何时候都更加重要。 对话式人工智能(包括聊天机器人和语音助手等技术)在打破这些语言障碍方面发挥着关键作用。 在这篇博文中&am…

Java对接海康威视摄像头实现抓图

目录 一、下载SDK 二、拷贝示例代码 三、拷贝库文件 四、运行Demo 五、抓图业务 六、调参 ​七、发布Linux正式环境 一、下载SDK 海康开放平台 二、拷贝示例代码 三、拷贝库文件 这时候直接运行ClientDemo会报错,因为缺失库文件! 四、运行Demo …