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

JVM——运行时数据区

运行时数据区的结构

大至结构如下图所示,其中白色部分为线程私有,灰色部分为线程共享部分

程序计数器

程序计数器可以看成当前线程字节码的行号指示器(下一行要执行什么程序),计数器记录的是正在执行的虚拟机字节码指令地址

当我们执行多线程程序时,多线程程序是线程轮流切换,一个处理器都会执行一条线程的指令,因此为了线程切换后能恢复到正确的执行位置,每条线程都需要有有一个独立的程序计数器(线程私有

虚拟机栈

虚拟机栈是线程私有的,为防止并发访问时造成冲突。

虚拟机栈包含的四部分

  • 局部变量表(Local Variable Table):存储方法参数、局部变量(基本类型值、对象引用)。

  • 操作数栈(Operand Stack):用于字节码指令的运算(如加减乘除、创建对象的引用等操作)。

  • 动态链接(Dynamic Linking):存储方法的符号引用,指向方法在方法区的元数据(如类、接口信息),用于动态绑定(多态时解析实际调用的方法)。

    • 方法父类实现,子类也有实现 当子类重写父类方法时,通过动态链接在运行时确定实际调用的子类方法

    • 符号引用(如类名、方法名)存储在方法区的常量池中,动态链接通过常量池解析到具体方法的内存地址。

  • 方法返回地址(Return Address):记录方法执行完成后返回的位置(如调用者的下一条指令地址),与returntry-catch逻辑相关。

本地方法栈

与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务

内存中最大的一块,是所有线程共享的内存区域

是存放对象的位置,"几乎"所有的对象实例以及数组都在堆上进行分配

是垃圾收集器所管理的内存区域(于现代垃圾收集器大部分都是基于分 代收集理论设计的——“新生代”“老年代”“永久代”)

从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区——TLAB(先从堆中分出一块内存给一个线程,分出另一块分给另一个线程,用完再进行申请,减少交互,类似银行取钱,不可能用多少取多少,而是先给100先用,用完再申请)

方法区

(1)方法区是各个线程共享的内存区域

(2)方法区在JVM启动的时候被创建,随 JVM 关闭而销毁 ,并且它的实际物理内存空间和Java堆区一样都可以是不连续的。

(3)方法区会发生内存溢出(OOM)

(4)元空间不在虚拟机设置的内存中,而是使用本地内存

 方法区的内部结构

方法区用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存、域信息等

类型信息:对每个加载的类型(class、interface,enum、annotation),jvm要存储类型信息有该类型和直接父类的完整有效名称(interface和Object没有父类)、该类型的修饰符和该类型直接接口的一个有序列表

域信息:JVM须在方法区保存类型的所有域的相关信息以及域的声明顺序

方法信息:方法名称、返回值类型,修饰符等

运行时常量池

保存Class文件中描述的符号引用外,还会把由符号引用(com.qcby.school)翻译出来 的直接引用也存储在运行时常量池中

http://www.xdnf.cn/news/2529.html

相关文章:

  • NLP预处理:如何 处理表情符号
  • 基于物理信息的神经网络在异常检测Anomaly Detection中的应用:实践指南
  • 解决Cline的Shell Integration Unavailable问题
  • 软考:软件设计师考试数据结构知识点详解
  • 引领印尼 Web3 变革:Mandala Chain 如何助力 1 亿用户迈向数字未来?
  • .class文件是字节码吗还是二进制文件
  • 【首款Armv9开源芯片“星睿“O6测评】SVE2指令集介绍与测试
  • Android调试那些事儿
  • uniapp-商城-42-shop 后台管理 分包
  • 多视觉编码器协同与高低分辨率特征融合技术综述
  • JVM——垃圾收集策略
  • 心形烟花优化展示效果
  • conda 常用命令
  • Docker:快速搭建 RabbitMQ 集群的技术指南
  • javaWeb开发---前后端开发全景图解(基础梳理 + 技术体系)
  • 【HarmonyOS 5】鸿蒙检测系统完整性
  • STM32F103_HAL库+寄存器学习笔记21 - CAN接收过滤器:CPU减负神器,提升系统效率的第一道防线
  • Ubuntu 磁盘空间占用清理(宝塔)
  • 创建一个springboot的项目-简洁步骤
  • 利用 Python 爬虫按关键字搜索 1688 商品详情:实战指南
  • 用户行为检测技术解析:从请求头到流量模式的对抗与防御
  • 大模型、知识图谱和强化学习三者的结合,可以形成哪些研究方向?
  • Java安全之cc链学习集合
  • 【C语言】fprintf与perror对比,两种报错提示的方法
  • 在Linux中,使用IO标准库进行读写操作。
  • Kubernetes学习笔记-环境变量的使用
  • 重构数字信任基石:Java 24 网络安全特性的全维度革新与未来防御体系构建
  • 30、不是说字符串是不可变的吗,string s=“abc“;s=“123“不就是变了吗?
  • HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)
  • 电镀废水资源化利用的工艺介绍