JVM运行时数据区域之PCRegister和虚拟机栈

news2024/10/7 10:21:59

运行时数据区域

Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据

区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启

动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java 虚

拟机规范》的规定,Java 虚拟机所管理的内存将会包括以下几个运行时数据区域,如图

所示。

 

程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当

前线程所执行的字节码的行号指示器。在 Java 虚拟机的概念模型里,字节码解释器工

作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制

流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数

器来完成。

由于 Java 虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现

的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执

行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需

要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内

存区域为“线程私有”的内存。

如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。此内存区域是唯一一个在《Java 虚拟机规范》中没有规定任何OutOfMemoryError 情况的区域。

Java 虚拟机栈

与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stack)也是线程私有的,

它的生命周期与线程相同。虚拟机栈描述的是 Java 方法执行的线程内存模型:每个方法

被执行的时候,Java 虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量

表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,

就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

经常有人把 Java 内存区域笼统地划分为堆内存(Heap)和栈内存(Stack),这种划

分方式直接继承自传统的 C、C++程序的内存布局结构,在 Java 语言里就显得有些粗糙

了,实际的内存区域划分要比这更复杂。不过这种划分方式的流行也间接说明了程序员

最关注的、与对象内存分配关系最密切的区域是“堆”和“栈”两块。其中,“堆”在稍后笔

者会专门讲述,而“栈”通常就是指这里讲的虚拟机栈,或者更多的情况下只是指虚拟机

栈中局部变量表部分。

局部变量表存放了编译期可知的各种 Java 虚拟机基本数据类型(boolean、byte、

char、short、int、 float、long、double)、对象引用(reference 类型,它并不等同于对象

本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或

者其他与此对象相关的位置)和 returnAddress 类型(指向了一条字节码指令的地址)。

这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中 64 位

长度的 long 和 double 类型的数据会占用两个变量槽,其余的数据类型只占用一个。局

部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈

帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大

小。请读者注意,这里说的“大小”是指变量槽的数量,虚拟机真正使用多大的内存空间

(譬如按照 1 个变量槽占用 32 个比特、64 个比特,或者更多)来实现一个变量槽,这

是完全由具体的虚拟机实现自行决定的事情。在《Java 虚拟机规范》中,对这个内存区域规定了两类异常状况:如果线程请求的

栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError 异常;如果 Java 虚拟机栈

容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出 OutOfMemoryError 异

常。

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

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

相关文章

群晖NAS搭建WebDav服务,并内网穿透实现公网访问

WebDAV是基于HTTP协议的通信协议。适用于有些客户限制于其他协议,要求使用WebDAV协议进行数据传输的,下面是通过WebDAV协议来访问群晖NAS的设置教程。 1. 在群晖套件中心安装WebDav Server套件 点击打开套件中心,并搜索webdav,点…

性能测试-linux-top/vmstat/dstat命令,闭着眼睛也要背出来

目录 Linux系统差异化 Ubuntu安装应用 CentOS安装应用 Linux通用安装,tar.gz包 Linux系统帮助命令 help/man/info Linux系统中树状结构查看文件 Linux系统中文件类型区分与权限 Linux系统中都有哪些文件夹及其作用 Linux性能测试分析-TOP命令(重点) Linu…

NFV关键技术:DPDK技术栈在网络云中的最佳实践

本文篇幅有限,很难用短短几语就勾勒出DPDK的完整轮廓,概括来说,DPDK是一个技术栈,主要用于Intel架构的服务器领域,其主要目的就是提升x86标准服务器的转发性能。因此,本文只重点介绍DPDK平台部分技术在电信…

基于stm32单片机智能温控风扇控制系统Proteus仿真

资料编号:103 下面是相关功能视频演示: 103-基于stm32单片机智能温控风扇控制系统Proteus仿真(源码仿真全套资料)功能介绍:采用stm32单片机、ds18b20温度传感器采集温度,通过判断当前的温度值是否超过预设…

程序员怎样才能写出一篇好的博客或者技术文章?

文章目录来分享下鹅厂多位技术同学关于如何写好技术文章的经验。**1 为什么要写文章****1.1 对作者的好处****1.1.1 复盘学习成果,巩固知识理解****1.1.2 提升思考能力****1.1.3 传播技术知识,积累技术资产****1.1.4 提升表达与总结能力****1.1.5 打造个…

尚医通 (二十五) --------- 医院接口开发

目录一、医院系统模拟接口1. 服务部署2. 操作说明3. 上传接口与回调接口① 业务术语② 安全控制③ 业务接口④ 平台接口⑤ 医院接口二、集成 MongoDB三、添加医院基础类四、上传医院五、参数签名六、图片 Base64 编码七、查询医院接口一、医院系统模拟接口 1. 服务部署 ① 找…

刷题笔记之十二(快到碗里来+跳台阶+变态跳台阶+不用加减乘除做加法+三角形+猴子分桃+反转部分单向链表)

目录 1. 快到碗里来 2. 跳台阶 3. 变态跳台阶 4. ConcurrentHashMap使用lock关键字保证线程安全;Arrays.asList返回值是List接口对象 5. 字符串对象比较相等,使用equals比较内容;使用 比较的是地址 6. 编译命令: javac 源文件名称.java; 运行命令: java 主类名称 要传递的…

第七章第二节:B树和B+树

文章目录教程:1. B树1.1 B树的定义1.2 B树的高度1.3 B树的插入和 删除1.4 B树的删除1.5 总结:2. B树2.1 B树的查找2.2 B树与B树的对比2.3 总结教程: B树: https://www.bilibili.com/video/BV1b7411N798/?p72&share_sourceco…

深入理解MySQL数据库(Innodb存储引擎)

1.BTree 什么是B Tree 1)树中每个结点至多有M棵子树(即至多含有m-1个关键字) 2)若根节点不是终端结点,则至少有两颗子树 3)所有的叶子结点都出现在同一层次上,并且不带信息 什么是BTree …

【毕业设计】37-基于单片机智能楼宇消防监控系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)

【毕业设计】37-基于单片机智能楼宇消防监控系统设计(原理图工程仿真工程源代码答辩论文答辩PPT) 文章目录【毕业设计】37-基于单片机智能楼宇消防监控系统设计(原理图工程仿真工程源代码答辩论文答辩PPT)资料下载链接任务书设计说…

Redis集群(Cluster)

Redis集群(Cluster) 单台redis容量限制,如何进行扩容?继续加内存、加硬件么?单台redis并发写量太大有性能瓶颈,如何解决?redis3.0中提供了集群可以解决这些问题。 redis集群是对redis的水平扩容,即启动N个…

静态后台管理(9页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 |学生管理系统网页设计 | OA管理系统 | 后台管理模板 | 智能停车系统 | 等网站的设计与制作 | HTML期末大学生网页设计作业,Web大学生网页 H…

C++ Visual Studio 2022 中的改进、行为更改和错误修复

目录 Visual Studio 2022 版本 17.4 中的一致性改进 作用域的基础类型没有固定类型enum 定义中没有固定基础类型的枚举器类型enum Visual Studio 2022 版本 17.3 中的一致性改进 改进了指针之间的修饰符兼容性检查 Visual Studio 2022 版本 17.2 中的一致性改进 未终止的双向…

【分隔结构】定从分离

形式 先行词 其他定语 定语从句先行词 状语 定语从句作主语的先行词 谓语 定语从句 练习一 他们从一部分人来说,是受到了 1998 年才获得的 DNA 证据的启发,这份 DNA 证据,几乎肯定的证明了 Thomas Jefferson 和 他的奴隶 Sally Hemin…

力扣(LeetCode)16. 最接近的三数之和(C++)

双指针 快排使 numsnumsnums 正序。 设置三个指针 iii 指向 numsnumsnums 第一个数,从前往后枚举 nums[i]nums[i]nums[i] , lll 从 nums[i1]nums[i1]nums[i1] 往后,指向第二个数,rrr 从 nums.size()−1nums.size()-1nums.size()…

【博客539】使用openssl手动为k8s集群签发证书

使用openssl手动为k8s集群签发证书 创建ca私钥和ca证书 1、生成ca私钥:生成一个 2048 位的 ca.key 文件 openssl genrsa -out ca.key 2048 2、基于ca私钥,生成根(root)证书:在 ca.key 文件的基础上,生成 ca.crt 文件 openssl re…

[MQ] 交换机与队列的介绍

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

[Spring Cloud] Open Feign 使用

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

机械设计基础试题3

一、判断题(请在后面的括号中,正确的填√,错误的填) (20分) 1. 如果机构的自由度F=2,则机构无确定性运动。 ( ) 2. 作相对运动的三个构件的三个瞬心不一定在一…

JavaEE 进阶:Spring 的创建和使用

文章目录前言一、创建 Spring 项⽬1、创建⼀个 Maven 项⽬2、添加 Spring 框架⽀持3、添加启动类二、存储 Bean 对象1、创建 Bean2、将 Bean 注册到容器三、获取并使⽤ Bean 对象1、创建 Spring 上下⽂① ApplicationContextⅠ 注意事项② BeanFactory③ ApplicationContext VS…