当前位置: 首页 > news >正文

JVM之【运行时数据区】

JVM简图

在这里插入图片描述

运行时数据区简图

运行时数据区

一、程序计数器(Program Counter Register)

1.程序计数器是什么?

程序计数器是JVM内存模型中的一部分,它可以看作是一个指针,指向当前线程所执行的字节码指令的地址。每个线程在执行过程中都有自己的程序计数器,因此程序计数器是线程私有的,独立于其他线程。

程序计数器不会OOM!!!

2.程序计数器的作用

  1. 指令执行:在每个线程执行字节码指令时,程序计数器会存储当前正在执行的字节码指令的地址。如果是正在执行本地方法(native method),那么程序计数器的值将是undefined。

  2. 指令跳转:在字节码指令执行完毕后,程序计数器会自动更新为下一条要执行的字节码指令的地址。通过这种方式,程序计数器可以确保字节码指令按顺序执行。

  3. 控制流管理:程序计数器帮助管理程序的控制流(如分支、循环、跳转等)。通过更新程序计数器的值,可以实现各种控制流指令(如if、for循环、switch等)的跳转逻辑。

  4. 多线程切换:由于Java是多线程的语言,每个线程都有自己独立的程序计数器。当线程切换时,程序计数器会保存当前线程的执行位置,当线程再次被调度时,程序计数器会恢复到之前保存的位置,以确保线程可以继续从正确的位置执行。


二、虚拟机栈(Java Virtual Machine Stack)

在Java虚拟机(JVM)中,每个线程在创建时都会创建一个虚拟机栈,虚拟机栈是每个线程私有的数据区,用于管理方法调用和执行。其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。每当一个线程调用一个方法时,JVM会为该方法创建一个新的栈帧(Stack Frame)并将其压入虚拟机栈中,方法执行完毕后,栈帧会从栈中弹出。

**存在OOM,不需要垃圾回收**
在这里插入图片描述

栈帧(Stack Frame)

1、JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出”/“后进先出”原则。在一条活动线程中,一个时间点上,只会有一个活动的栈帧。
2、只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈被称为当前栈帧(Current Frame),与当前栈帧相对应的方法就是当前方法(CurrentMethod),定义这个方法的类就是当前类(CurrentClass)。
3、执行引擎运行的所有字节码指令只针对当前栈帧进行操作。如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前帧。

在这里插入图片描述

1.栈帧的组成部分

  1. 局部变量表(Local Variable Array/Table)
  2. 操作数栈(Operand Stack)
  3. 动态链接(Dynamic Linking)
  4. 方法返回地址(Return Address)
  5. 附加信息(Additional Information)
    在这里插入图片描述

2.详细描述

1. 局部变量表(Local Variable Array/Table)
  • 原理:局部变量表是一个数组,用于存储方法的局部变量,包括方法参数和方法内部定义的变量。
  • 作用:为每个方法提供存储和访问局部变量的空间。局部变量通过索引进行访问,索引从0开始。例如,int a = 10; 中的 a 就存储在局部变量表中。
  • 存储信息:存储了方法的参数和方法内部定义的局部变量。可以存储各种数据类型,包括基本数据类型(int、float、long、double等)以及对象引用。
2. 操作数栈(Operand Stack)
  • 原理:操作数栈是一个LIFO栈,用于字节码指令执行时的临时存储空间。
  • 作用:在方法执行过程中,用于保存中间计算结果、传递参数以及存储返回值。例如,执行加法操作 i + j 时,会将 ij 压入操作数栈,执行完加法操作后,将结果存储在操作数栈中。
  • 存储信息:方法执行过程中临时存储的操作数、中间计算结果。
3. 动态链接(Dynamic Linking)
  • 原理:每个栈帧包含指向运行时常量池的方法引用,,方法的具体指针信息。
  • 作用:当方法被调用时,动态链接会将符号引用转换为实际的内存地址。例如,调用一个方法时,会将该方法在常量池中的符号引用转换为实际的方法地址。
4. 方法返回地址(Return Address)
  • 原理:在方法调用时,返回地址会记录调用方法的指令地址,以便方法返回时能找到正确的返回位置。
  • 作用:方法执行完毕后,返回到调用该方法的地方继续执行。这个地址一般是调用方法的下一条指令。
5. 附加信息(Additional Information)
  • 原理:附加信息因JVM实现而异,包括栈帧的一些其他信息,比如调试信息和性能分析信息。
  • 作用:为JVM提供更多的运行时信息支持,如异常处理信息、JVM优化信息等。

相关文章:

  • JDK17新特性整理
  • 扫雷的技巧
  • React封装Canvas组件
  • Excel表格在线解密:轻松解密密码,快速恢复数据
  • 某大型制造集团企业信息化建设总体规划设计方案(67页PPT)
  • Java计算日期相差天数的几种方法
  • 【代码随想录37期】Day18 找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树
  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁
  • flink读kafka写mysql数据库
  • 【LeetCode】【1】两数之和(1141字)
  • 美业美容院会员服务预约店铺管理小程序的效果是什么
  • 粤嵌—2024/5/17—N 皇后 ||(✔)
  • 各大模型厂商API使用:百度、阿里、豆包、kimi、deepseek
  • AIGC 004-T2I-adapter另外一种支持多条件组合控制的文生图方案!
  • 计算机视觉与深度学习实战:以Python为工具,基于深度学习的汽车目标检测
  • Apache Spark Streaming 使用实例
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JAVA之继承和多态
  • Leetcode 27 Remove Element
  • Linux后台研发超实用命令总结
  • Netty源码解析1-Buffer
  • Redux 中间件分析
  • 阿里云前端周刊 - 第 26 期
  • 检测对象或数组
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前言-如何学习区块链
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 字符串匹配基础上
  • AI算硅基生命吗,为什么?
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​渐进式Web应用PWA的未来
  • ​力扣解法汇总946-验证栈序列
  • # linux从入门到精通(三)
  • $(selector).each()和$.each()的区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (3)llvm ir转换过程
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)linux使用docker容器运行mysql
  • (三)Honghu Cloud云架构一定时调度平台
  • (三分钟)速览传统边缘检测算子
  • (五)activiti-modeler 编辑器初步优化
  • (源码分析)springsecurity认证授权
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET CLR基本术语
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET 通过系统影子账户实现权限维持
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @vue/cli 3.x+引入jQuery
  • [000-01-008].第05节:OpenFeign特性-重试机制
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬