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 方法。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模-预测人口数据

目录 中国09~18年人口数据 创建时间 绘制时间序列图 使用专家建模器 得到结果 预测结果 残差的白噪声检验 中国09~18年人口数据 创建时间 路径:数据-> 定义日期和时间 绘制时间序列图 使用专家建模器 看看spss最终判断是那个模型最佳的契合 得到结果 预…

美国CEC能效认证测试简介

CEC能效认证测试简介 CEC是美国加利福尼亚州能源委员会(California Energy Commis-sions)的简称,它的职责是使能源市场朝着良性竞争的方向发展。该组织从1976年开始推行的加州电器能效法规(Appliance Efficiency Regul-ation&…

二叉树【Java】

文章目录 一、树型结构二、二叉树2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的遍历 三、二叉树的基本操作3.1获取树中节点的个数3.2获取叶子节点的个数3.3获取第K层节点的个数3.4获取二叉树的高度3.5检测值为value的元素是否存在 一、树型结构 树是一种非线性的数据…

高级分布式系统-第10讲 分布式控制系统

高级分布式系统汇总:高级分布式系统目录汇总-CSDN博客 自动化是关于一切人造系统自动、智能、自主、高效和安全运行的科学与技术 计算机控制技术是实现自动化的主要方法和手段 分布式控制技术是伴随着机器大工业生产而诞生的特殊计算机控制技术 计算机控制系统 …

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路…

1-Docker-基础

本文内容多处参考黑马程序员的公开资料,仅用来个人梳理,原资料地址:https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec Docker介绍 为什么要用Docker? 以Mysql安装为例,想要在Linux系统上安装Mysql&…

Docker登录MySQL,密码正确却提示密码错误

当我输入了正确的MySQL密码的时候确提示我密码错误: ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES) docker run --name mysql_master \ -e MYSQL_ROOT_PASSWORD123123 \ -v /root/mysql_master/data:/var/lib/mysql \ -v /root…

scroll-view在小程序页面里实现滚动,uniapp项目

要实现红框中的区域进行滚动,scroll-view必须写高 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><textv-for"(ite…

ssh免密登录 ssh公钥分发 ssh密钥生成

在连接服务器时&#xff0c;我们会被要求输入用户名对应的密码&#xff0c;如下&#x1f447;&#xff1a; 如果我们要登录的服务器是常用服务器&#xff0c;那么每次登录输入密码就会比较麻烦。那么如何免密登录呢&#xff1f;那就需要使用到rsa公私钥认证了。 生成rsa密钥…

操作系统课程设计-Linux 进程控制

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 进程的创建 3.1.1 步骤 3.1.2 关键代码 3.2 子进程执行新任务 3.2.1 步骤 3.2.2 关键代码 4 实验结果与分析 4.1 进程的创建 4.2 子进程执行新任务 5 代码 5.1 进程的创建 5.2 子进程执行新任务 前言 本实验为课…

使用composer构建软件包时文件(夹)权限设置

在构建软件包的时候你可能会需要对包源内文件或文件夹的权限做出相应的调整&#xff0c;以确保软件包在部署到客户端后可以正常运行。在此之前我们先来了解一下Apple文件系统内文件或文件夹的权限设定。 常见的文件或文件夹会有Owner, Group, Everyone这三种类型的所有权&#…

关于C#中Monitor的wait/pulse的理解

wait&#xff1a;表示释放对象上的锁并阻止当前线程&#xff0c;直到它重新获取该锁。 pulse&#xff1a;表示通知等待队列中的线程锁定对象状态的更改。 当线程调用 Wait 时&#xff0c;它会释放对象上的锁并进入对象的等待队列。 对象的就绪队列中的下一个线程 (如果有一个…