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

news/2024/5/6 5:28:41/文章来源:https://blog.csdn.net/zhouhe_/article/details/128108336

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  修改后 2471main(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.luyixian.cn/news_show_227980.aspx

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

相关文章

电商新趋势:Starday拿下黑色星期五的制胜法宝是物流速度

国内电商“双十一”购物狂欢季活动已经闭幕,“双十二”又将袭来,但更多人却将眼光放在蓬勃发展的跨境电商行业中。当下跨境电商卖家们正在各大跨境电商服务平台的带领下全力备战,在“黑色星期五”期间推出各类大促活动,奋力冲刺20…

Unknown custom element: <el-image>无法使用该组件,升级element-ui版本后项目报错

需求背景&#xff1a; 项目中需要使用图片点击放大&#xff0c;想要使用<el-image>组件&#xff0c;引入后报了下面的错&#xff0c;需要升级element版本&#xff0c;element-ui版本过低&#xff0c;没有该组件。 过程&#xff1a; cnpm i element-ui2.14.1 --save-dev…

clickhouse远程访问Oracle 11g数据库(clickhouse-jdbc-bridge)

1、简介 clickhouse-jdbc-bridge&#xff1a;是clickhouse提供的一个jdbc组件&#xff0c;用于通过JDBC的方式远程访问其他数据库表。 2、安装 &#xff08;1&#xff09;下载源文件并打包获取clickhouse-jdbc-bridge-2.0.7-shaded.jar 在官网&#xff1a;https://github.c…

tictoc例子理解10-13

tictoc10-13tictoc 10 几个模块连接&#xff0c;发送消息直到模块3收到消息tictoc 11 新增信道定义tictoc 12 双向连接信息简化定义tictoc 10 几个模块连接&#xff0c;发送消息直到模块3收到消息 让我们用几个(n)’ tic’模块让它更有趣&#xff0c;并将每个模块连接到其他模…

ANR 触发、监控、分析 一网打尽

平时看博客或者学知识&#xff0c;学到的东西比较零散&#xff0c;没有独立的知识模块概念&#xff0c;而且学了之后很容易忘。于是我建立了一个自己的笔记仓库 (一个我长期维护的笔记仓库&#xff0c;感兴趣的可以点个star~你的star是我写作的巨大大大大的动力)&#xff0c;将…

大客车玻璃擦净器设计

目 录 摘 要 I ABSTRACT II 1 绪论 1 1.1选题背景及意义 1 1.2发展现状 2 1.3发展趋势 3 1.4研究主要内容 4 2 大客车玻璃擦净器总体方案设计 5 2.1 大客车玻璃擦净器设计思想 5 2.2功能分析 5 2.3工作原理分析 6 2.4功能分解 6 2.4.2传动系统 6 2.4.3真空吸盘 7 2.4.4 清洁刷 …

欢聚季报图解:营收5.87亿美元同比降10% 净利提升

雷递网 雷建平 11月29日欢聚集团(NASDAQ: YY)今日发布2022年第三季度财报。财报显示&#xff0c;欢聚集团2022年第三季度营收为5.867亿美元&#xff0c;较上年同期下降10%。欢聚集团2022年第三季度Bigo Live的平均移动MAU为3540万&#xff0c;较上年同期的3100万增长14.2%&…

转铁蛋白修饰的去氢骆驼蓬碱磁纳米脂质体TF-HM-MPS

转铁蛋白又名运铁蛋白&#xff08;Transferrin&#xff0c;TRF、Tf&#xff09;&#xff0c;负责运载由消化管吸收的铁和由红细胞降解释放的铁。以三价铁复合物&#xff08;Tf-Fe3&#xff09;的形式进入骨髓中&#xff0c;供成熟红细胞的生成。转铁蛋白主要存在于血浆中&#…

冒烟测试的7个好处,你是否经常用到它?

以下为作者观点&#xff1a; 冒烟测试(smoke testing)是在开发的早期阶段评估基本的软件组件&#xff0c;以检查它们是否 “着火”&#xff08;有问题&#xff09;&#xff0c;本文旨在介绍冒烟测试及其在程序开发过程中的作用。 什么是冒烟测试&#xff1f; 冒烟测试是在开…

企业日常公关如何抵御负面信息的入侵?

如今&#xff0c;互联网时代信息传播速度极快&#xff0c;这使得宣传工作效率倍增&#xff0c;也给企业舆情管理带来一定的挑战。舆情优化搞得好&#xff0c;企业宣传工作事半功倍&#xff0c;网络舆论走向负面的话&#xff0c;则对宣传工作非常不利&#xff0c;会导致推广效果…

狂神说Go语言学习笔记(一)

一、Go语言的发展史 二、Go语言能做什么 三、Go语言环境安装 下载地址 国外网站太慢&#xff0c;我们使用中文网进行下载&#xff01; Go下载 - Go语言中文网 - Golang中文社区 (studygolang.com) 安装 无脑下一步就完了 &#xff0c;注意下这里创建自己设置一个Go语言的环…

比搞笑诺奖还离谱,看完国产AIGC最新创作,把我给整不会了

杨净 萧箫 发自 凹非寺量子位 | 公众号 QbitAI现在&#xff0c;AI生成的东西&#xff0c;“真实”得都让我有点害怕了——只是给出《马斯克获得诺贝尔物理学奖》这个标题&#xff0c;AI竟然就刷刷刷几下&#xff0c;蹦出了一整套大纲来&#xff1f;&#xff01;如果让AI生成一些…

计算机网络——分层结构,协议接口,服务

分层结构 主机进行资源共享时需满足以下条件&#xff1a; &#xff08;1&#xff09;发起通信的计算机要将数据通路进行激活 &#xff08;2&#xff09;告诉网络如何识别主机 &#xff08;3&#xff09;发起通信的主机要查明目的主机是否开机等 &#xff08;4&#xff09;发起…

【Linux】权限讲解

一、什么是权限 1、权限概念 权限随处可见&#xff0c;在生活中&#xff0c;腾讯非VIP用户不能观看VIP视频&#xff0c;看小说也需要会员&#xff0c;所以权限是限制人的&#xff0c;一件事是否允许被谁做。在Linux系统中也有许多权限&#xff0c;访问文件需要权限&#xff0c…

Windows OpenGL 图像色彩替换

目录 一.OpenGL 图像色彩替换 1.原始图片2.效果演示 二.OpenGL 图像色彩替换源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL…

[附源码]Python计算机毕业设计Django的实验填报管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

FastDFS文件上传

分布式文件存储-FastDFS 介绍 FastDFS为互联网量身定制&#xff0c;充分考虑了冗余备份、负载均衡、线性扩容等机制&#xff0c;并注重高可用、高性能等指标&#xff0c;使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS体系结构 FastD…

基于改进粒子群算法的微电网多目标优化调度(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

62 - 单例类模板

---- 整理自狄泰软件唐佐林老师课程 1. 单例模式 1.1 需求的提出 在架构设计时&#xff0c;某些类 在整个系统生命期中 最多只能有一个对象存在&#xff08;Single Instance&#xff09; 1.1.1 问题 如何定义一个类&#xff0c;使得这个类最多只能创建一个对象&#xff1f;…

模拟电路设计(35)---几种脉宽调制型开关电路

Forward单端正激变换器 在buck变换器开关与负载之间插入隔离变压器&#xff0c;这种隔离型buck变换器叫做Forward单端正激变换器。如下图所示&#xff1a; Forward单端正激变换器 简单分析可知&#xff0c;滤波电感L在开关管关断期间&#xff0c;通过续流二极管为负载提供电流…