JVM之【运行时数据区1】

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,但是不需要垃圾回收**

在这里插入图片描述

如何设置栈大小

-Xss:一般默认大小为1024KB
单位为bytes,还可以使用KB/MB/GB单位进行设置

栈帧(Stack Frame)

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

在这里插入图片描述

1.栈帧的组成部分

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

2.详细描述

1. 局部变量表(Local Variable Array/Table)
  • 原理
    • 局部变量表是一个数组,用于存储方法的局部变量,包括方法参数和方法内部定义的变量。 这些数据类型包括各类基本数据类型、对象引用,以及返回地址。
    • 局部变量表是建立在线程的栈上,是线程私有数据,不存在数据安全问题。
    • 局部变量表的容量大小,实在编译期间确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。
    • 方法嵌套调用的极限次数,由栈的大小决定。参数和局部变量越多,使得局部变量表膨胀,栈帧就越大,就会导致嵌套调用次数减少。
    • 表中的变量,只在当前方法调用中有效。方法调用结束后,随着栈帧的销毁,局部变量表随之销毁。
  • 作用:为每个方法提供存储和访问局部变量的空间。局部变量通过索引进行访问,索引从0开始。例如,int a = 10; 中的 a 就存储在局部变量表中。
  • 存储信息:存储了方法的参数和方法内部定义的局部变量。可以存储各种数据类型,包括基本数据类型(int、float、long、double等)以及对象引用。

大概看一下局部变量表
在这里插入图片描述
局部变量表

1、上图中,这里的参数名称、参数类型中的cp_info#,就是符号名称/符号引用,指的就是常量池中的内容。
2、以int 变量 a 为例,19、20 就对应了变量a和int类型
3、需要注意,非静态方法的局部变量表中,第一个序号0一定为this,指向当前方法。静态方法则没有
4、序号是slot,32位的类型占用1个slot,64位的占用两个slot,所以这里的序号都是1递增。如果使用double变量,就会看到序号会+2
5、不足32位的按照32来算,其中byte、short、char、boolean都会被转换为int来储存

在这里插入图片描述

2. 操作数栈(Operand Stack)
  • 原理
    • 操作数栈是一个LIFO栈,用于字节码指令执行时的临时存储空间。
    • 栈的最大深度在编译期就定义好了。并保存在方法的Code属性的max_stack数据中。
    • 和局部变量表类似,在栈中,32位的类型占用1个深度,64位的占用两个深度
  • 作用:在方法执行过程中,用于保存中间计算结果、传递参数以及存储返回值。例如,执行加法操作 i + j 时,会将 ij 压入操作数栈,执行完加法操作后,将结果存储在操作数栈中。
  • 存储信息:方法执行过程中临时存储的操作数、中间计算结果。

举例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 动态链接(Dynamic Linking)
  • 原理:每个栈帧包含指向运行时常量池中,该栈帧所属方法的引用,目的是为了支持当前方法的代码能够实现动态链接。
  • 作用
    • Java源文件倍编辑成字节码文件时,所有变量和方法引用,都作为符号引用,保存在常量池中(在上面局部变量表中,有截图)
    • 当一个方法调用另外其他方法时,动态链接会将符号引用转换为实际的方法内存地址。
      在这里插入图片描述
(1)静态链接和动态链接
  • 静态链接:
    当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知且运行期保持不变时。这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接。
  • 动态链接:
    如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用方法的符号引用转换为直接引用,由于这种引用转换过程具备动态性,因此也就被称之为动态链接。
(2)早期绑定和晚期绑定

对应的方法的绑定机制为:早期绑定(EarlyBinding)和晚期绑定(Late Binding)。绑定是一个字段、方法或者类在符号引用被替换为直接引用的过程,这仅仅发生一次。

  • 早期绑定:
    早期绑定就是指被调用的目标方法如果在编译期可知,且运行期保持不变时即可将这个方法与所属的类型进行绑定,这样一来,由于明确了被调用的目标方法究竟是哪一个,因此也就可以使用静态链接的方式将符号引用转换为直接引用。
  • 晚期绑定
    如果被调用的方法在编译期无法被确定下来,只能够在程序运行期根据实际的类型绑定相关的方法,这种绑定方式也就被称之为晚期绑定。

** 这里主要还是针对多态的 **

4. 方法返回地址(Return Address)
  • 原理
    • 在方法调用时,返回地址会记录调用方法的指令地址,以便方法返回时能找到正确的返回位置。
    • 方法返回有两类:正常完成、异常退出
    • 正常返回时,会调用方法的下一条指令
    • 异常退出时,需要通过异常表来确定,栈帧不保存相关信息
  • 作用:方法执行完毕后,返回到调用该方法的地方继续执行。这个地址一般是调用方法的下一条指令。
  • 本质上,方法的退出就是当前栈帧出栈的过程。此时,需要恢复上层方法的局部变量表、操作数栈、将返回值压入调用者栈帧的操作数栈、设置PC寄存器值等,让调用者方法继续执行下去。
  • 正常完成出口和异常完成出口的区别在于:通过常完成出口退出的不会给他的上层调用者产生任何的返回值。
5. 附加信息(Additional Information)
  • 原理:附加信息因JVM实现而异,包括栈帧的一些其他信息,比如调试信息和性能分析信息。
  • 作用:为JVM提供更多的运行时信息支持,如异常处理信息、JVM优化信息等。

课后问答

  1. 举例栈溢出的情况?(StackOverflowError)
  2. 调整栈大小,就能保证不出现溢出吗?
  3. 分配的栈内存越大越好吗?
  4. 垃圾回收是否会涉及到虚拟机栈?
  5. 方法中定义的局部变量是否线程安全?

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

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

相关文章

『ZJUBCA MeetUP』 5月25日线下活动——Aptos 链的动态与应用

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME:2024/05/25 ADD:浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区,致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

5分钟了解APP广告变现成功之道!

在当今的移动互联网时代,随着智能手机的普及,越来越多的APP应运而生,竞争愈发激烈。 对于开发者和企业来说,如何在保证用户体验的前提下实现广告变现,成为了一个既重要又棘手的问题。 本文旨在深入探讨和揭示成功的A…

济南著名起名大师,现代山东文化名人颜廷利教授:通过魔方解析世界

济南著名起名大师,现代山东文化名人颜廷利教授:通过魔方解析世界 在山东济南,中国第一起名大师的恩师颜廷利教授不仅是一位杰出的齐鲁文化名人,更是全球首个利用魔方游戏来解析和理解世界的先驱。他的理论框架——包括升命学说、净…

YOLO目标检测:框架技术原理和代码实现

Dream推荐 适读人群 :本书适合对YOLO目标检测感兴趣、了解深度学习相关概念的算法工程师、软件工程师等人员阅读。 全面:涵盖6个常用目标检测框架(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOX、YOLOv7)的发展状况、技术原理和代码实…

过敏者的福音:猫毛克星大揭秘!使用宠物空气净化器效果如何?

对于猫毛过敏者来说,家中爱宠的陪伴与过敏的困扰并存,给他们的日常生活带来了极大的不便。猫毛过敏者常常因为与猫咪接触后出现打喷嚏、鼻塞、眼睛发痒等症状而苦恼,严重时甚至可能影响到他们的呼吸健康。 然而,这并不意味着猫毛…

相机等效焦距

1. 背景 物理焦距我们很熟悉,但是在接触实际的相机参数时,相机厂家会提到一个参数等效焦距,甚至有时候不提供物理焦距,这时候如果我们得到真实的物理焦距需要进行一定的转换.在介绍两者之间的转换关系前,先介绍一下等效焦距的由来. 如上图,假设在某一个镜头,其成像面会出现图…

无线领夹麦克风哪个品牌音质最好?领夹麦克风品牌排行榜前十名

​短视频、直播已成为现代生活中不可或缺的一部分,而领夹式无线麦克风则是这些活动中不可或缺的重要工具。它们能够轻松捕捉声音,让内容更加生动、真实。然而,市场上的无线麦克风种类繁多,价格各异,如何挑选一款适合自…

5G NR TAE TEST

环境配置: 测试TAE时,需要比对不同的Antenna Port之间的差异来测试 配置DL 2 layer MU的case layer1:通过设置weight,只有一个物理天线上有weight,其他天线上的weight为0,该天线的DMRS DMRS Port设置为1…

最佳 Mac 数据恢复:恢复 Mac 上已删除的文件

尝试过许多 Mac 数据恢复工具,但发现没有一款能达到宣传的效果?我们重点介绍最好的 Mac 数据恢复软件 没有 Mac 用户愿意担心数据丢失,但您永远不知道什么时候会发生这种情况。无论是意外删除 Mac 上的重要文件、不小心弄湿了 Mac、感染病毒…

HTML动态响应2-Servlet+Ajax实现HTTP前后台交互方式

作者:私语茶馆 前言 其他涉及到的参考章节: HTML动态响应1—Ajax动态处理服务端响应-CSDN博客 Web应用JSON解析—FastJson1.2.83/Tomcat/IDEA解析案例-CSDN博客 HTML拆分与共享方式——多HTML组合技术-CSDN博客 1.场景: WEb项目经常需要前后端交互数据,并动态修改HTML页…

定时器与PWM的LED控制

目录 一、基础概念定时器定时器类型定时器特性 PWM定义占空比原理 二、实验1.LED周期性亮灭定时器TIM2配置GPIO引脚设置工程相关参数配置Keil编写程序 2.LED呼吸灯(PWM)呼吸灯原理Keil编写程序Keil虚拟示波器,观察 PWM输出波形设置点击setup,并设置观察引…

统计计算六|自助法及置换检验(Bootstrap and Permutation Test)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法(Expectation-Maximization Algorithm,期望最大化算法) 统计计算三|Cases for EM 统计计算四|蒙特卡罗方法(Monte Carlo Method) 统计计算五|MCMC&#x…

spring boot 中的异步@Async

spring boot 开启异步调用 1、启动类上添加EnableAsync注解,表示启动异步 2、在具体实现异步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…

rtos最小任务切换的实现 keil软件仿真 stm32 PendSV

最小任务切换的实现 本例子实现了一个 rtos 最小的任务切换功能,使用 keil 仿真功能,在模拟的 stm32f103 的器件上实现了使用 PendSV 中断切换线程的效果。 git 源码仓库:https://github.com/yutianos/rtos-little 本文链接:csdn…

时钟、复位与上电初始化

目录 1. 复位2.1. 异步复位 同步释放2.2. Xilinx FPGA复位设计尽量少用复位reg信号初始值基于PLL锁定(locked)复位设计 2. 时钟 1. 复位 FPGA中复位设计总结 深入理解复位—同步复位,异步复位,异步复位同步释放(含多时钟域&#x…

认识Oracle v$mystat视图

v$mystat就是当前用户的各种统计信息, sid就是session的id(也就是当前用户),STATISTIC#就是统计量的编号(用来唯一确定统计量的名称),value是统计量的值; desc命令在Oracle中通常用于查看表结构; v$mystat视图中只会有当前用户…

pdf拆分成有图和无图的pdf(方便打印)

pdf拆分成有图和无图的pdf(方便打印) 原因 打印图片要彩印,每次都要手动弄,打印的时候很麻烦; 随着打印次数的增加,时间就越来越多 为解决此问题,使用python写一个exe解决这个问题 历程 找一个python的GUI界面找到 t…

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 目录 Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 一、简单介…

Linux前奏-预热版本

一、操作系统概述 1.1 了解操作系统的作用 我们所熟知的计算机,也就是电脑,就是由硬件和软件来组成的 硬件:计算机系统中由电子机械,和各种光电元件等组成的各种物理装置的总称 软件是什么呢? 软件:用…

视频汇聚平台EasyCVR对接GA/T 1400视图库结构化数据:人员/人脸、非/机动车、物品

在信息化浪潮席卷全球的背景下,公安信息化建设日益成为提升社会治理能力和维护社会稳定的关键手段。其中,GA/T 1400标准作为公安视频图像信息应用系统的核心规范,以其结构化数据处理与应用能力,为公安信息化建设注入了强大的动力。…