JVM内存模型/运行时数据区域

java虚拟机管理这块内存,所以我们也叫运行时数据区域

总览

在这里插入图片描述
这里按线程是否共享来分类,所谓线程不共享就是每个线程里面都会配一套 程序计数器 栈, 互相不干涉。
而方法区和堆是线程所有共享 意味着只有一个(这里注意堆是实际概念 方法区是一个虚拟概念)

程序计数器

在这里插入图片描述


注意:程序计数器记录字节码的内存地址,这个内存地址是怎么来的?
在前几篇中 字节码通过 .class文件 由类加载器 加载到方法区中(在解析那一步 将引用地址替换成堆内存里面的内存地址)
如下:
在这里插入图片描述

字节码中每一行都用地址标识,程序计数器就像是一个地址指示器,告诉执行程序 下一行去执行哪里。

java虚拟机的多线程是线程轮流切换 并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,处理器只会执行一条线程中的指令。 所以 为了线程切换后能恢复到正常位置 每个线程都需要一个独立的程序计数器,这就是为什么 程序计数器不能像堆 方法区那样 多线程共享

这篇博客的读者 一定要理解透这一点。


java虚拟机栈

在这里插入图片描述

栈这个数据结构是个单向的,你可以把它想象成一个竖着的一边开口的箱子。它是先进后出。

看上图的Demo: main 调用a , a调用b ,b调用c。

那么在栈里面就是 mian 先入栈,后面依次是 a b c 入栈, 然后c先被执行完 执行完之后 c 出栈,后面 b a main 依次出栈。

这个时候新手可能会蒙蔽一下:a 调用 b 不是a先执行吗? 这里要注意,执行b方法 这个过程是 执行a方法中的一部分,a调用b的时候a开始执行 但是没执行完 b执行完之后 还在a的方法里面 再往下走 a才执行完


上面就是方法执行过程中栈的逻辑,每执行一个方法 就是一个栈内部栈帧入栈和出栈的过程。

然后我们来学习一下 java虚拟机栈内部一个栈帧由哪些组成:

局部变量表
局部变量表里面存放着,运行过程中所有的局部变量,我们知道 每执行一个方法就会创建一个栈帧,那么这个方法里面的局部变量自然要存入栈帧里面,所以在栈帧里面就创建一个局部变量表来专门存储这些局部变量,方法结束 栈帧也就出栈结束了。

顺便说一句 一个方法一般都会有 方法参数,参数变量也会存在这里。

操作数栈
操作数栈你可以把它理解成一个临时存放数据的区域,虚拟机在执行字节码指令的时候 需要把一些数据临时存起来备用,
比如我们交换 a和 b的值 在计算机里面 你需要把a的值先临时放到某个地方 然后把b的值给a 再从那个临时存放点 把a的值拿出来给b
这种执行指令时留的一点余地 就是操作数栈的作用

帧数据
帧数据不同的虚拟机有差异
这里面最主要的需要了解的两个:

  • 动态链接:在字节码指令中,一个类可能需要调用其他类的方法或者属性,这时候就需要用动态链接 用一个映射把其他类的方法信息引进来
  • 方法出口:上面说过一个方法执行完 就是一个栈弹出的过程,但是弹出以后 虚拟机会疑惑 此时线程执行到哪里了?? 这里就需要在方法出口中记录方法执行完后 下一步的位置信息。

本地方法栈

本地方法栈和虚拟机栈发挥的作用很相似,只不过虚拟栈针对的是java代码编译后的字节码

本地方法栈针对的是 虚拟机本身的底层已经编写好的 native 方法。

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

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

相关文章

自动化的自动化(1)--OPCUA2HTML5

现在的自动化工程师是令人沮丧的,他们努力地实现各个行业的自动化系统,自己却停留在敲键盘的手工劳作的阶段,该解放自己了。这就是“自动化实现自动化”的话题。 OPC 统一架构(简称 OPC UA)是现代工厂自动化中用于机器…

Jenkins之pipeline

安装插件 Pipeline Pipeline: Stage View Plugin 创建任务 配置 demo 开始实践 拉取git仓库代码 checkout scmGit(branches: [[name: */main]], extensions: [], userRemoteConfigs: [[url: http://178.119.30.133:8929/root/mytest.git]])通过SonarQube做质量检测 sh …

在 Linux 本地部署 stable diffusion

由于工作站安装的是 ubuntu,卡也在上面,就只能在 ubuntu 上部署安装 stable diffusion 了。另外,Linux 上使用 stable diffusion 也会方便很多。 1 准备工作 NVIDIA 官网下载驱动,主要是为了规避多卡驱动不同的问题。由于本机是…

C语言中的浮点数存储

首先明确一个概念:C语言中整形是按照二进制存储在内存中,浮点型是按科学计数法存储在内存中(本质上存储的还是二进制数据0和1)。 如果没看懂这句话,没关系!看完以下正文,你就会豁然开朗&#x…

Codeforces Round 114 (Div. 1) C. Wizards and Numbers(思维题 辗转相除+博弈 巴什博弈)

题目 t(t<1e4)组询问&#xff0c;每次询问(a,b)&#xff08;0<a,b<1e18&#xff09;&#xff0c; 不妨a<b&#xff08;a>b时需要交换两个数考虑&#xff09; ①令b减去a的k次方&#xff08;k>1&#xff09;&#xff0c;要求减完之后b非负 ②令bb%a 当a和…

MATLAB - 使用 TOPP-RA 求解器生成带约束条件的时间最优轨迹

系列文章目录 前言 本例演示如何生成满足速度和加速度限制的轨迹。该示例使用了 contopptraj 函数&#xff0c;该函数使用可达性分析 (RA) 求解受约束的时间最优路径参数化 (TOPP) 轨迹。 一、示例背景 本例解决的是 TOPP 问题&#xff0c;这是一个机器人问题&#xff0c;其目…

Vue知识总结-下

VUE-组件间通信 组件的自定义事件 概述&#xff1a;是一种组件间通信的方式,适用于&#xff1a;子组件>父组件使用场景&#xff1a;A是父组件,B是子组件,B给A传递数据,那么需要在A组件中绑定自定义事件(事件的回调也在A中)使用步骤 绑定自定义事件&#xff1a; 第一种方式…

【Java SE语法篇】10.String类

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 前言1. String类1.1 字符串的构造1.2 String对象的比…

将Sqoop与Hive集成无缝的数据分析

将Sqoop与Hive集成是实现无缝数据分析的重要一步&#xff0c;它可以将关系型数据库中的数据导入到Hive中进行高级数据处理和查询。本文将深入探讨如何实现Sqoop与Hive的集成&#xff0c;并提供详细的示例代码和全面的内容&#xff0c;以帮助大家更好地了解和应用这一技术。 为…

GIT SourceTree 回滚提交

步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 在终端输入命令&#xff08;位置是项目目录下&#xff09; git push origin feature_mo2.1_r3_zhanx653 -f

任务15:使用Hive进行全国气象数据分析

任务描述 知识点&#xff1a; 使用Hive进行数据分析 重 点&#xff1a; 掌握Hive基本语句熟练使用Hive对天气数据进行分析 内 容&#xff1a; 使用Hive创建外部表使用Hive对数据进行统计分析 任务指导 1. 使用Hive创建基础表 将China_stn_city.csv文件上传到HDFS的/…

数学建模day16-预测模型

本讲首先将介绍灰色预测模型&#xff0c;然后将简要介绍神经网络在数据预测中的应用&#xff0c;在本讲的最 后&#xff0c;我将谈谈清风大佬对于数据预测的一些看法。 注&#xff1a;本文源于数学建模学习交流相关公众号观看学习视频后所作 目录 灰色系统 GM(1,1)…

C# 面向切面编程之AspectCore初探

写在前面 AspectCore 是Lemon名下的一个国产Aop框架&#xff0c;提供了一个全新的轻量级和模块化的Aop解决方案。面向切面也可以叫做代码拦截&#xff0c;分为静态和动态两种模式&#xff0c;AspectCore 可以实现动态代理&#xff0c;支持程序运行时在内存中“临时”生成 AOP 动…

【PID精讲 14 】积分分离PID和抗积分饱和PID

文章目录 一、积分分离PID1.1 积分分离PID算法基本思想1.2 积分分离PID算法实现步骤1.3 积分分离PID算法1.4 积分分离PID算法实现1.5 积分分离PID算法仿真实例1.6 积分分离PID算法的优缺点 二、抗积分饱和PID2.1 积分饱和现象2.2 抗积分饱和算法2.3 抗积分饱和算法实现2.4 抗积…

免费的域名要不要?

前言 eu.org的免费域名相比于其他免费域名注册服务&#xff0c;eu.org的域名后缀更加独特。同时&#xff0c;eu.org的域名注册也比较简单&#xff0c;只需要填写一些基本信息&#xff0c;就可以获得自己的免费域名。 博客地址 免费的域名要不要&#xff1f;-雪饼前言 eu.org…

bee工具的使用及创建第一个项目

前提文章&#xff1a;beego的安装及配置参数说明-CSDN博客 提示&#xff1a;beego框架下项目需要再GOPATH/src下进行开发&#xff0c;我的GOPATH是C:\Users\leell\go web项目创建 通过 bee new 创建web项目 C:\Users\leell\go\src>bee new beego-web 2024/01/15 21:40:0…

使用ffmpeg进行视频截取

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

概率论与数理统计————3.随机变量及其分布

一、随机变量 设E是一个随机试验&#xff0c;S为样本空间&#xff0c;样本空间的任意样本点e可以通过特定的对应法则X&#xff0c;使得每个样本点都有与之对应的数对应&#xff0c;则称XX&#xff08;e&#xff09;为随机变量 二、分布函数 分布函数&#xff1a;设X为随机变量…

VC++读取ini文件示例2

之前学习过ini文件读写&#xff1b;继续熟悉&#xff1b; CString str1;UINT m1 0;UINT m2 0;TCHAR p1[32];m1 GetPrivateProfileString(_T("mymoney1"), _T("moneyname1"), _T("空"), p1, sizeof(p1), _T("E:\\VCPrj\\VC2015\\cattest\…

transbigdata笔记:其他方法

1 出租车相关 1.1 taxigps_to_od 提取出租车OD信息 transbigdata.taxigps_to_od(data, col[VehicleNum, Stime, Lng, Lat, OpenStatus]) 输入出租车GPS数据&#xff0c;提取OD信息 data出租车GPS数据col[VehicleNum, Time, Lng, Lat, OpenStatus]五列 比如GPS数据长这样&am…