JVM之运行时数据区 PC、虚拟机栈、本地方法栈

news2024/11/25 16:27:08

JVM之运行时数据区 PC、虚拟机栈、本地方法栈

  • PC寄存器
    • 线程回顾
    • 寄存器
    • 实践
    • 面试
      • 使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器记录当前线程的执行地址
      • PC寄存器为什么会被设定为线程私有
  • 虚拟机栈
    • 虚拟机栈出现背景
    • 简介
    • 栈可能出现的异常
    • 栈中存储着什么
    • 运行原理
    • 栈帧内部结构
      • 局部变量表
      • Slot
    • 操作数栈
    • 栈顶缓存技术
    • 动态连接(指向运行时的方法引用)
      • 方法调用
      • 虚方法与非虚方法
    • 方法返回地址
    • 一些附加信息
  • Error & GC
  • 本地方法栈

请添加图片描述

请添加图片描述

PC寄存器

线程回顾

  • 线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行
  • 在HotSpot JVM里,每个线程都与操作系统的本地线程直接映射
    当一个Java线程准备好执行以后,此时一个操作系统的本地线程同时创建。Java线程执行终止后,本地线程也会回收
  • 操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,他就会调用JAVA线程中的run方法
    请添加图片描述
  • 如果你使用jconsole或者任何一个调试工具,都能看到在后台许多线程在运行。这些后台线程不包括调用public static void main(String[])的main线程以及所有这个main线程自己调用的线程
  • 这些主要的后台系统线程在HotspotJVM里主要是以下几个
    虚拟机线程:这种现成的操作需要JVM达到安全点才会出现。这些操作必须在不同的线程中发生的原因使他们都需要JVM达到安全点,这样堆才不会变化。这种线程的执行类型包括“stop-the-world”的垃圾收集,线程栈收集,线程挂起以及偏向锁撤销
    周期任务线程:这种线程是时间周期事件的体现(比如中断),他们一般用于周期性操作的调度执行
    GC线程:这种线程对JVM里不同种类的垃圾收集行为提供了支持
    编译线程:这种现成运行时会将字节码编译成到本地代码
    信号调度线程:这种接收信号并发送給JVM,在它内部通过调用适当的方法进行处理

寄存器

请添加图片描述

JVM中的程序计数器(Program Counter Register)中,Register 的命名源于CPU的寄存器,寄存器存储至指令相关的现场信息。CPU只有数据装载到寄存器才能够运行。
这里,并非是广义上所指的物理寄存器,或者将其翻译为PC计数器会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象

  • 他是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域
  • 在JVM规范中,每个线程都有自己的程序计数器,是线程私有的,生命周期与线程的生命周期一致
  • 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址:或者,如果是在执行native方法,则是未指定值(undefined)
    请添加图片描述
    理解:每个线程都有一个寄存器,寄存器记录了当前线程执行代码指令的顺序

实践

class文件反编译指令:javap -verbose file.class 或者 javap -v file.class

请添加图片描述

面试

使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器记录当前线程的执行地址

请添加图片描述
因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行
JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令
总结:通过指令地址找到操作指令,记录下一步指令如何执行

PC寄存器为什么会被设定为线程私有

请添加图片描述
我们知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停的做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确的记录各个线程正在执行的当前字节码指令地址,最好的办法自然是每个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从不会出现相互干扰的情况

由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或多核处理器中的一个内核,只会执行某个县城中的一条指令.
这样必然导致经常中断或恢复,如何保证分毫无差呢?每个线程创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响
请添加图片描述

虚拟机栈

虚拟机栈出现背景

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的
优点是 跨平台,指令集小,编译器容易实现,缺点是 性能下降,实现同样的功能需要更多的指令集

请添加图片描述
请添加图片描述

简介

  • java虚拟机栈是什么
    java虚拟机栈,早起叫做java栈,
    每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应这一次次的Java方法调用。
    线程使用

  • 生命周期
    生命周期和线程一致

  • 作用
    主管java程序的运行,他保存方法的局部变量、部分结果,并参与方法的调用和返回

请添加图片描述

栈可能出现的异常

java虚拟机规范允许Java栈的大小是动态的或者固定不变的

  • 如果采用固定大小的java虚拟机栈,那每一个线程的java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过java虚拟机允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常
  • 如果java虚拟机可以动态扩展,并且尝试扩展的时候无法申请到足够的内存,或者创建新的线程时没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个OutOfMemoryError异常

修改栈内存大小
请添加图片描述

请添加图片描述


public class Test {
    private static int i = 1;
    public static void main(String[] args) {
        i++;
        System.out.println(i); // 未修改时 : 11405  修改后 2471
        main(args);
    }
}

栈中存储着什么

  • 每个线程都有自己的栈,栈中的数据都是以栈帧(Stack Frame)的格式存在
  • 在这个线程上正在执行的每隔方法都各自对应一个栈帧(Stack Frame)
  • 栈帧是一个内存块,是一个数据集,维系着方法执行过程中得各种数据信息

运行原理

  • 操作:压栈 出栈,遵循“先进先出”原则
  • 在一条活动线程中,一个时间点上,只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧是有效的,这个栈帧被称为当前栈帧(Current Frame),与当前栈相对应的方法就是 当前方法(Current Method),定义这个方法的类就是当前类(Current Class)
  • 执行引擎运行的所有字节码指令只针对当前栈帧进行操作
  • 如果该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前帧
    请添加图片描述
    请添加图片描述

栈帧内部结构

请添加图片描述

请添加图片描述

局部变量表

  • 定义为 一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference)、以及returnAddress类型
  • 由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题
  • 局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximun local variables数据项中。在方法运行期间是不会改变局部变量表的
    请添加图片描述

Slot

请添加图片描述

请添加图片描述
请添加图片描述

操作数栈

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

栈顶缓存技术

请添加图片描述

动态连接(指向运行时的方法引用)

请添加图片描述

  • 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。
    包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking),比如:invokedynamic指令
  • 在Java源文件被编译到字节码文件时,所有的变量和方法引用都作为符合引用(Symbolic Reference)保存到class文件的常量池里。
    比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法引用来表示的,那么 动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
    请添加图片描述
    为什么要常量池?
    作用:提供一些符号和常量,便于指令识别

方法调用

请添加图片描述请添加图片描述
动态链接、晚期绑定 例子:多态

虚方法与非虚方法

请添加图片描述
请添加图片描述

方法返回地址

请添加图片描述

一些附加信息

jvm不同实现而言,可选

Error & GC

运行数据区ErrorGC
pcXX
X
方法区

本地方法栈

请添加图片描述

请添加图片描述
请添加图片描述

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

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

相关文章

二、【redux】redux 完整版求和Demo

文章目录1、添加count_action.js1.1、项目结构变化1.2、CODE1.2.1、count_action.js1.2.2、Count_Redux.jsx2、添加constant.js2.1、项目结构变化2.2、CODE2.2.1、constant.js2.2.2、count_action.js2.2.3、count_reducer.js本示例补全 上一章 redux mini版示例,使用…

Codeforces Round #721 (Div. 2) C. Sequence Pair Weight

翻译&#xff1a; 序列的权值定义为具有相同值(&#x1d44e;&#x1d456;&#x1d44e;&#x1d457;)的无序索引对(&#x1d456;&#xff0c;&#x1d457;)(这里&#x1d456;<&#x1d457;)的数量。例如&#xff0c;序列&#x1d44e;[1,1,2,2,1]的权值为4。具有相同…

5-UI自动化-三大切换,iframe如何定位,窗口新开、alert弹窗如何进行元素定位

5-UI自动化-三大切换&#xff0c;iframe如何定位&#xff0c;窗口新开、alert弹窗如何进行元素定位新开一个窗口如何定位元素switch_to方法iframe定位元素alert弹窗如何定位元素上篇介绍4-UI自动化-selenium三大等待操作 web测试过程中有没有遇到以下问题&#xff1a; 1、测试…

中概股回暖,B站打开向上通道

“回来了&#xff0c;我感觉他们都回来了。”周星驰《少林足球》中这句经典台词&#xff0c;最近成为了中概股投资者的口头禅。 财报季临近尾声&#xff0c;好消息已经层出不穷。中概互联网指数KWEB在11月的涨幅超过30%&#xff0c;不少个股从低位大幅反弹&#xff0c;其中就包…

C/C++家族族谱管理系统

C/C家族族谱管理系统 课题名称: 家族族谱管理 主要目标: 通过训练&#xff0c;强化学生对树结构、二叉树结构的表示及操作算法的掌握和灵活运用 3.具体要求: 要求设计实现具有下列功能的家谱管理系统: (1) 输入文件以存放最初家谱中各成员的信息&#xff0c;成员的信息中…

[Java] 从内存的角度去理解ThreadLocal如何把不同线程间的访问隔离开来?ThreadLocal的内存泄露问题是什么?如何避免?

文章目录前言前置知识&#xff1a;堆内存与栈内存普通数据结构类和ThreadLocal存取数据的不同&#xff1f;结合源码来看ThreadLocal如何实现的1. ThreadLocal类get方法2. ThreadLocal类的getMap(Thread)方法3. Thread类的threadLocals属性4. ThreadLocal类的setInitialValue()方…

win11该文件没有与之关联的应用怎么办

win11用户在使用电脑的时候遇到了“该文件没有与之关联的应用”的提示&#xff0c;这是怎么回事呢&#xff1f;应该怎么办呢&#xff1f;出现这个情况应该是注册表被误删了&#xff0c;大家需要新建一个文本文档&#xff0c;然后输入下文提供的指令&#xff0c;之后将其重命名为…

亚信科技亮相南京软博会,数智赋能百行千业

11月23至25日&#xff0c;主题为“软件赋能 数智转型”的2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会在南京国际博览中心盛大启幕。“数智化全栈能力提供商”亚信科技携“云网边端”产品体系&#xff0c;5G、人工智能、边缘AI、机器人流程自动化、数…

AlphaFold2源码解析(4)--模型架构

AlphaFold2源码解析(4)–模型架构 我们将Alphafold的流程分为一下几个部分&#xff1a; 搜索同源序列和模板特征构造特征表示MSA表示与残基对表示之间互相交换信息残基的抽象表示转换成具体的三维空间坐标 模型参数 AlphaFold有多个不同类型的参数&#xff08;单体&#x…

一文让你理解Linux权限问题

前言&#xff1a; 权限是个很重要的一部分&#xff0c;无论是在Linux系统中还是在生活里&#xff0c;权限都是必不可缺失的一部分&#xff0c;在生活中&#xff0c;权限是很常见的&#xff0c;例如VIP&#xff0c;如果你不是VIP你就不能享用VIP的一些特有的功能&#xff0c;这就…

WebRTC学习笔记四 RTCDataChannel

一、RTCDataChannel 简单来说&#xff0c;RTCDataChannel 就是在点对点连接中建立一个双向的数据通道&#xff0c;从而获得文本、文件等数据的点对点传输能力。它依赖于流控制传输协议&#xff08;SCTP&#xff09;&#xff0c;SCTP 是一种传输协议&#xff0c;类似于 TCP 和 U…

[ECCV2022]Language-Driven Artistic Style Transfer

标题&#xff1a;Language-Driven Artistic Style Transfer 链接&#xff1a;https://sites.cs.ucsb.edu/~william/papers/LDAST.pdf 如标题所示&#xff0c;本文做的是基于文本引导的风格迁移。整体的思路还是用的AST(arbitrary style transfer)那一套自编码器结构。AST的思…

期中考试【Verilog】

期中考试【Verilog】前言推荐期中考试一. 单选题&#xff08;共10题&#xff09;二. 填空题&#xff08;共5题&#xff09;三. 简答题&#xff08;共3题&#xff09;四. 其它&#xff08;共4题&#xff09;最后前言 编写于2022/11/30 13:30 以下内容源自Verilog期中试题 仅供…

Windows访问centOS的Tomcat

首先&#xff0c;先准备好jdk1.8和Tomcat的文件 点击此处获取jdk1.8和Tomcat的文件&#xff08;提取码&#xff1a;xxrc&#xff09; 配置IP地址 打开终端输入ifconfig&#xff0c;检查centOS的ip地址 根据要求&#xff0c;是要把ip地址最后一位改为自己的学号&#xff08;前…

手把手教你做智能合约开源|多文件合约开源|引用文件开源

本文手把手教你使用 区块链浏览器 验证智能合约的三种方式。 验证单一 Solidity 文件 在开始验证之前&#xff0c;我们需要首先部署智能合约。进入 Remix IDE&#xff0c;创建一个合约新文件。复制粘贴下面的代码&#xff1a; // SPDX-License-Identifier: MITpragma solidit…

夜曲编程Python体验课

目录 day1 编程中的“文本” 代码规范 打印数字 打印字符串 注释 总结思维导图 day2 变量与赋值 变量 常量 赋值 格式化输出 转义字符&#xff1a; 总结思维导图 day3 编程中的“数字” 整形 浮点型 运算符 四种常见的四则运算符&#xff08; - * / &…

【软件测试】测试人的我们,咋做一个如鱼得水的测试员?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 一千个人&#xff0…

短视频创作,主动变现和被动变现方式详解,建议收藏反复阅读-下

同样先说纲要&#xff0c;有兴趣可以继续看下去&#xff0c;上一篇讨论了抖音变现的有三个建议&#xff0c;①变现标准低、②变现天花板高、③可主动变现。 这一篇的内容只要是抖音上被动和主动两类变现方式&#xff0c;涉及了直播打赏&#xff0c;广告接单&#xff0c;视频带货…

小啊呜产品读书笔记001:《邱岳的产品手记-15》第28讲 产品分析的套路(上):谁是利益相关者? 29讲产品分析的套路(中):解决什么问题?

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-15》第28讲 产品分析的套路&#xff08;上&#xff09;&#xff1a;谁是利益相关者&#xff1f;& 29讲产品分析的套路&#xff08;中&#xff09;&#xff1a;解决什么问题&#xff1f; 一、今日阅读计划二、泛读&知…

【Big Data】Hadoop--MapReduce经典题型实战(单词统计+成绩排序+文档倒插序列+每月Top3温度)

&#x1f34a;本文使用了4个经典案例进行MapReduce实战 &#x1f34a;参考官方源码&#xff0c;代码风格较为优雅 &#x1f34a;解析详细 一、Introduction MapReduce是一个分布式运算程序的编程框架&#xff0c;核心功能是将用户写的业务逻辑代码和自身默认代码整合成一个完整…