JVM——运行时数据区(程序计数器+栈)

news2025/1/20 3:42:07

目录

  • 1.程序计数器
  • 2.栈
    • Java虚拟机栈 - 栈帧的组成
      • 1.Java虚拟机栈-局部变量表
      • 3.Java虚拟机栈-操作数栈
      • 3.Java虚拟机栈-帧数据
  • 3.Java虚拟机栈-栈内存溢出
  • 4.本地方法栈

在这里插入图片描述

⚫ Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。
⚫ 《Java虚拟机规范》中规定了每一部分的作用。
在这里插入图片描述

1.程序计数器

⚫ 程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字节码指令的地址

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

⚫ 在加载阶段,虚拟机将字节码文件中的指令读取到内存之后,会将原文件中的偏移量转换成内存地址。每一条字节码指令都会拥有一个内存地址。在这里插入图片描述

⚫ 在代码执行过程中,程序计数器会记录下一行字节码指令的地址。执行完当前指令之后,虚拟机的执行引擎根据程序计数器执行下一行指令
在这里插入图片描述
在这里插入图片描述
⚫ 程序计数器可以控制程序指令的进行,实现分支、跳转、异常等逻辑。

⚫ 在多线程执行情况下,Java虚拟机需要通过程序计数器记录CPU切换前解释执行到那一句指令并继续解释运行。
在这里插入图片描述

程序计数器在运行中会出现内存溢出吗?
⚫ 内存溢出指的是程序在使用某一块内存区域时,存放的数据需要占用的内存大小超过了虚拟机能提供的内存上限。
⚫ 因为每个线程只存储一个固定长度的内存地址,程序计数器是不会发生内存溢出的。
⚫ 程序员无需对程序计数器做任何处理。

2.栈

Java虚拟机栈(Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先
进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。
在这里插入图片描述
在这里插入图片描述

⚫ Java虚拟机栈随着线程的创建而创建,而回收则会在线程的销毁时进行。由于方法可能会在不同线程中执行,每个线程都会包含一个自己的虚拟机栈。
在这里插入图片描述

Java虚拟机栈 - 栈帧的组成

在这里插入图片描述

1.Java虚拟机栈-局部变量表

⚫ 局部变量表的作用是在方法执行过程中存放所有的局部变量。编译成字节码文件时就可以确定局部变量表的内容。
在这里插入图片描述
在这里插入图片描述
⚫ 栈帧中的局部变量表是一个数组,数组中每一个位置称之为槽(slot) ,long和double类型占用两个槽,其他类型占用一个槽。在这里插入图片描述
⚫ 实例方法中的序号为0的位置存放的是this,指的是当前调用方法的对象,运行时会在内存中存放实例对象的地址。在这里插入图片描述
⚫ 方法参数也会保存在局部变量表中,其顺序与方法中参数定义的顺序一致。
⚫ 局部变量表保存的内容有:实例方法的this对象,方法的参数,方法体中声明的局部变量。在这里插入图片描述
在这里插入图片描述
⚫ 为了节省空间,局部变量表中的槽是可以复用的,一旦某个局部变量不再生效,当前槽就可以再次被使用
在这里插入图片描述

3.Java虚拟机栈-操作数栈

⚫ 操作数栈是栈帧中虚拟机在执行指令过程中用来存放中间数据的一块区域。他是一种栈式的数据结构,如果一条指令将一个值压入操作数栈,则后面的指令可以弹出并使用该值。
⚫ 在编译期就可以确定操作数栈的最大深度,从而在执行时正确的分配内存大小。在这里插入图片描述
在这里插入图片描述

3.Java虚拟机栈-帧数据

⚫ 当前类的字节码指令引用了其他类的属性或者方法时,需要将符号引用(编号)转换成对应的运行时常量池中的内存地址。动态链接就保存了编号到运行时常量池的内存地址的映射关系。在这里插入图片描述
⚫ 方法出口指的是方法在正确或者异常结束时,当前栈帧会被弹出,同时程序计数器应该指向上一个栈帧中的下一条指令的地址。所以在当前栈帧中,需要存储此方法出口的地址。在这里插入图片描述
⚫ 异常表存放的是代码中异常的处理信息,包含了异常捕获的生效范围以及异常发生后跳转到的字节码指令位置在这里插入图片描述
在这里插入图片描述

3.Java虚拟机栈-栈内存溢出

⚫ Java虚拟机栈如果栈帧过多,占用内存超过栈内存可以分配的最大大小就会出现内存溢出。
⚫ Java虚拟机栈内存溢出时会出现StackOverflowError的错误
在这里插入图片描述
如果我们不指定栈的大小,JVM 将创建一个
具有默认大小的栈。大小取决于操作系统和
计算机的体系结构。在这里插入图片描述
Java虚拟机栈 – 注意事项
1、与-Xss类似,也可以使用 -XX:ThreadStackSize 调整标志来配置堆栈大小。
格式为: -XX:ThreadStackSize=1024
2、HotSpot JVM对栈大小的最大值和最小值有要求:
比如测试如下两个参数:
-Xss1k
-Xss1025m
Windows(64位)下的JDK8测试最小值为180k,最大值为1024m。
3、局部变量过多、操作数栈深度过大也会影响栈内存的大小。
一般情况下,工作中即便使用了递归进行操作,栈的深度最多也只能到几百,不会出现栈的溢出。所以此参数可以手动指定为-Xss256k节省内存。

4.本地方法栈

⚫ Java虚拟机栈存储了Java方法调用时的栈帧,而本地方法栈存储的是native本地方法的栈帧。
⚫ 在Hotspot虚拟机中,Java虚拟机栈和本地方法栈实现上使用了同一个栈空间。本地方法栈会在栈内
存上生成一个栈帧,临时保存方法的参数同时方便出现异常时也把本地方法的栈信息打印出来。在这里插入图片描述

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

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

相关文章

编程时不知道怎么给函数起一个好名字时怎么办

2023年11月16日,周四下午 解决办法 把函数的功能告诉ChatGPT,然后让它帮你给函数起名就可以了, 相信我,它取的名字真的很好。 举例说明 思维拓展 其实不光函数,变量、枚举等的名字也可以让ChatGPT取。

英伟达再放AI芯片“大招” H200 GPU是人工智能技术的里程碑

原创 | 文 BFT机器人 前言: 在11月13号,英伟达推出了AI芯片H200 GPU,标志着人工智能和计算领域的重大飞跃,标志着生成式AI领域进入了新时代。这款尖端图形处理芯片是对前身H100的升级版本,H100在训练OpenAI的高级大语…

二维码智慧门牌管理系统升级解决方案:流量监控引领服务卓越

文章目录 前言一、流量监控功能概述二、流量监控的益处三、应用案例和成功故事四、实施和支持 前言 随着科技的不断发展,二维码智慧门牌管理系统在其便捷高效的管理方式下,深受广大用户喜爱。为了更好地满足用户需求,提升服务质量&#xff0…

Linux下好玩的指令(持续更新)

适用于centOS下,别的Linux换个指令就行,内容是一样的 centOS有的指令安装不了?试试拓展yum源,再安装基本就OK啦! yum install -y epel-release 下面是作者在centOS环境下亲测可以使用的,如果你是root用户直…

私域电商:实体商家想通过异业联盟引流,应该怎么做?

​异业联盟引流是一种有效的营销策略,通过与不同行业的企业或品牌合作,共同推广产品或服务,扩大品牌影响力和用户群体。以下是异业联盟引流的一些详细过程: ​选择合作联盟: 首先,需要选择与自己企业或品…

【ArcGIS Pro二次开发】:CC工具箱1.1.1更新_免费_安装即可用

CC工具箱1.1.1更新【2023.11.15】 使用环境要求:ArcGIS Pro 3.0 一、下载链接 工具安装文件及使用文档: https://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5rhttps://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5r 二、使用方法 1、在下…

MyBatis CURD操作深度解析

文章目录 简单查询操作插入、更新和删除操作selectKey元素的作用结语 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:MyBatis ✨文章内容: CURD操作 &#x1f9…

解决requests库中的期限处理问题:从404到异常再到修复

在使用requests库进行网络请求时,用户可能会遇到一个奇怪的问题:当没有指定请求的期限时,他们得到的响应是404错误,但是一旦指定了请求的期限,就立刻遇到了一个异常,声称远程主机强制关闭了连接。这个问题让…

android studio基本使用

as如果一直index,就把缓存目录全部删除 记录下as日常使用。 调试工具 c动态库调试 ndk会带一些调试工具,例如 C:\Users\luopu\AppData\Local\Android\Sdk\ndk\20.0.5594570\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch…

群晖7.2版本通过Container Manager安装xiaoya-alist

小雅Alist,可以说是Alist应用中挂载阿里云最完美的成功案例。 一、下载镜像 注册表中下载镜像 Container Manager应该是7.2版本才改名,就是以前的docker。 打开【Container Manager】-【注册表】-【搜索框】搜索 xiaoya 内容区域,搜出的…

快速入门ESP32——开发环境配置PlatformIO IDE

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 一、下载安装二、验证 一、下载安装 下载安装 vscode 安装PlatformIO插件 创建工程 二、验证 写一个简单的函数来验证一下功能 void setup() {// put your setup cod…

rocketmq 安装dashboard1.0.0 mq消息控制台安装 rocketmq控制台安装 rocketmq-dashboard-1.0.0编译安装

1. 官网: 下载 | RocketMQ 2. dashboard安装包位置: 在连接最下面,点击download.zip即可 3. 需要安装maven, 编译命令: mvn clean install -U -Dmaven.test.skiptrue4. 启动jar: java -jar rocketmq-dashboard-1.0.0.jar &…

Maven编译报错:javacTask: 源发行版 1.8 需要目标发行版 1.8

报错截图: IDEA中的jdk检查都正常设置的1.8一点毛病没有。参考其他帖子链接如下: https://blog.csdn.net/zhishidi/article/details/131480199https://blog.51cto.com/u_16213460/7197764https://blog.csdn.net/lck_csdn/article/details/125387878 逐…

dewarp:数据变换

一. 效果 输入图片:test.jpg 前向场:test.npy 输出图片:dewarp_img.jpg 二. 代码 import os import cv2 import numpy as npdef align_flow(image, flow):"""flow: -1~1, 非文本区域是nanbm_flow: 对齐的bm,可以直接对图…

Android14 Beta 5

Beta 5,这是 Android 14 Beta 计划中的最后一次计划更新。这是确保您的应用程序已准备就绪并在非 Beta 用户开始获取 Android 14 之前提供反馈的最后机会。为了使您能够在跨多种外形尺寸的设备上测试您的应用程序,Beta 5 适用于 Pixel Tablet 和 Pixel F…

Camtasia2024喀秋莎微课制作神器新版本功能介绍

最近无论是b站,抖音,快手等视频软件中都有不少微课视频、电视剧解说横空出世,通过这些“热度”带来的收益也是无法估量的,很多自媒体博主月入上万惹人羡慕。 不少朋友也想在这股短视频洪流中分一碗羹,但又苦于技术跟不…

基于Springboot的非物质文化网站(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的非物质文化网站(有报告)。Javaee项目,springboot项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介…

redis数据结构汇总

redis每个【数据类型】所对应的【数据结构】 小结: String 主要是SDS,Long 1、基本编码方式是RAW,value SDS 2、EMBSTR编码 value SDS 并且SDS长度小于44字节,只需要调用一次内存分配函数,效率更高 3、INT编码&a…

超详细 | 萤火虫算法原理及其实现(Matlab)

群智能(Swarm Intelligence,SI)是一类分散自组织系统的集体智能行为的总称,该表述最早在1989年由Gerardo Beni在分子自动机系统中提出。SI系统可视作一组简单的个体,其个体与个体、个体与环境之间存在交互作用,最终表征出智能行为…

【第2章 Node.js基础】2.7 Node.js 的流

2.7 Node.js 的流 什么是流 流不是 Node.js 特有的概念。它们是几十年前在 Unix 操作系统中引入的。 我们可以把流看作这些数据的集合,就像液体一样,我们先把这些液体保存在一个容器里(流的内部缓冲区 BufferList),…