【JVM】JVM执行流程和内存区域划分

是什么

Java 虚拟机

  • JDK,Java 开发工具包
  • JRE,Java 运行时环境
  • JVM,Java 虚拟机

JVM 就是 Java 虚拟机,解释执行 Java 字节码

JVM 执行流程

编程语言可以分为:

  • 编译型语言:先将高级语言转换成二进制的机器指令,再由 CPU 去直接执行
  • 解释型语言:一边去转换,一边去执行
    这样的说法放单今天,硬件不适用了

按照上述这种经典的划分方式,可以认为 Java 属于“半编译,半解释”。Java 这么设定,最主要的目的就是为了“跨平台”。

  • 像 C++这样的语言是直接编译成了二进制的机器指令,而不同的 CPU 支持的指令不一样,而且生成的可执行程序,在不同的系统上也有不同的格式
    • Windows 可执行程序:PE 格式
    • Linux 可执行程序:ELF 格式

当前看到的手机操作系统,为什么只有安卓、iOS?

  • 因为搞一个新的系统,现有的软件不能兼容,没有生态也就没有市场
  • 鸿蒙能直接运行安卓程序,是因为鸿蒙不是新系统,只是安卓套壳

Java 不想重新编译,而是期望能够直接执行

  • 先通过 javac.java 文件==> .class 文件(字节码文件,包含的就是 Java 字节码,Java 自己搞的一套 CPU 指令)
    • 因为如果生成 CPU 直接能执行的指令的话,不同的 CPU 支持的指令就不一样,就不能在所有系统上执行
  • 这样先把 java 代码转成对应的 java 字节码文件,然后在某个具体的系统平台上执行,此时通过 JVM 把上述的字节码转换成对应的 CPU 能识别的机器指令(JVM 就是一个翻译官的角色)

通过上述转换,我们就可以不去重新编译,也能够完成良好的跨平台。因此,我们编写和发布一个 java 程序,其实就只要发布 .class 文件就可以了,JVM 拿到 .class 文件之后,就知道如何转换

  • Windows 上的 JVM 就可以把 .class 转换成 Windows 上能支持的可执行指令了
  • Linux 上的 JVM 就可以把.class 转换成 Linux 上可以支持的可执行指令了
    不同平台的局面是存在差异的,而不是同一个。对上(给 java 层面上提供的内容)是统一一致的

内存区域划分

JVM 其实也是一个进程(任务管理器中看到的 java 进程)image.png|203
进程运行过程中,要从操作系统这里车身轻一些资源(内存就是其中的典型资源),这些内存空间就支撑了后续 java 程序的执行。

  • 比如,在 java 中定义变量(就会申请内存),内存其实就是 JVM 从系统这边申请到的内存,然后再交给具体的 java 程序去使用

JVM 从系统申请了一大块内存,这一大块内存给 java 程序使用的时候,又会根据实际的使用用途,来划分出不同的空间,这就是所谓的“区域划分image.png|604

代码中 new 出来的对象,都是在堆里。对象中持有的非静态成员变量,也都在堆里。只有一份

  • 静态成员变量在元数据区

本地方法栈/虚拟机栈。包含了方法调用关系和局部变量

  • 在代码执行过程中,肯定会涉及到很多方法的调用,调用的关系就通过栈空间记录下来
  • 虚拟机栈,记录了 Java 代码的调用关系,Java 代码的局部变量
  • 本地方法栈,记录了 JVM 内部,通过 C++ 写的代码的调用关系和局部变量

一般不会关注本地方法栈,一般来说谈到栈,就默认指的是“虚拟机栈

这里谈到的“堆“和“栈“,和数据结构中的“堆“和“栈“是不同的。这里的是两块区域

程序计数器

这个区域比较小,专门用来存储下一条要执行的 Java 指令的地址

元数据区

“元数据”是计算机中的一个常见术语(meta data),往往指的是一些辅助性质的,描述性质的属性。只有一份

比如:硬盘上不仅仅要存储数据本体,还要存储一些辅助信息:文件的大小、文件的位置、文件的拥有者、文件的修改时间、文件的权限信息… 这些辅助信息统称为“元数据

在以前的 Java 版本中,也叫做“方法区”,从 1.8 开始改的名字

云数据区中主要保存:

  • 类的信息
  • 方法的信息
    一个程序,有哪些类、每个类里都有哪些方法、每个方法里面都要包含哪些指令,都会记录在元数据区。

我们写的 Java 代码,ifwhilefor 等各种逻辑运算,这些操作都会被转换成 Java 字节码

  • javac 就会完成上述代码到字节码的转换
  • 此时这些字节码在程序运行的时候就会被 JVM 加载到内存中,放到元数据区(方法区)里面
  • 之后,当前程序要如何执行,要做哪些事情,就会按照上述元数据区里面记录的字节码一次执行了

我们所编写的代码,都会被转换成二进制指令,都会进入到内存中,然后才能执行。

类似于剧本杀

  • 剧本杀里面给美格玩家发一个剧本,每个玩家就按照剧本上给出的要求来演
  • 此处所谓 Java 字节码,要执行的方法的细节,就像剧本一样,需要把剧本加载到内存中,然后才能执行

堆和元数据区只有一份(所有线程共享一份),栈和程序计数器可能有 n 份(和线程相关,每个线程都有自己的程序计数器和栈(每个线程有自己的执行流))

经典笔试题

在下面代码中,tnm 分别处于 JVM 内存中的哪个区域?

class Test() {private int n;private static int m;
}main() {Test t = new Text();
}
  • t 是一个局部变量(引用类型),在
  • nTest 的成员变量,new 出来的 Test 是在堆上的,所以 n 作为成员变量也是处于
  • static 修饰的变量,称为“类属性”;static 修饰的方法,称为“类方法
  • static 修饰的变量,称为“实例属性”;非 static 修饰的方法,称为“实例方法
  • 所以这里的 m 是长在类上的成员,和 newnew 实例没有关系。上述带有 static 修饰的变量,就是在类对象中,也就是在元数据区中(方法区)

类对象,Test.class

  • JVM.class 文件加载到内存之后,就会把这里的信息使用对象来表示,此时这样的对象就是类对象
  • 类对象里就包含了一系列的信息,包括但不限于:
    • 类的名称
    • 类继承自那个类
    • 实现了哪些接口
    • 都有哪些成员,都叫什么,都是什么类型,都是什么权限
    • 都有哪些方法,都叫什么,都是什么参数,都是什么权限

.java 文件中涉及到的信息都会在 .class 中有所体现(注释是不会包含的)

区分一个变量在哪个内存区域中,最主要的就是看变量的形态

  • 局部变量
  • 成员变量
  • 静态成员变量

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

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

相关文章

飞腾平台perf工具PMU事件集成指南

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

linux信号| 学习信号三步走 | 学习信号需要打通哪些知识脉络?

前言: 本节内容主要讲解linux下信号的预备知识以及信号的概念, 信号部分我们将会分为几个阶段进行讲解:信号的概念, 信号的产生, 信号的保存。本节主要讲解信号 ps:本节内容适合学习了进程相关概念的友友们进行观看哦 目录 什么是…

大模型算法岗常见面试题100道(值得收藏)

大模型应该是目前当之无愧的最有影响力的AI技术,它正在革新各个行业,包括自然语言处理、机器翻译、内容创作和客户服务等等,正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个,在大模型纵横的时代,不…

测试从业者需要了解心理学和经济学

对于测试从业者来说,测试工作是一项技术活,但同时它也涉及到经济学和人类心理学一些重要因素。 在理想情况下,我们会测试程序的所有可能执行情况,而在大多数情况下,这几乎是不可能的。即使一个看起来非常简单的程序&a…

828华为云征文|使用华为云Flexus云服务器X搭建部署茶叶商城小程序uniapp

在当今数字化时代,小程序以其便捷、高效的特点成为了众多商家拓展业务的重要渠道。 本文将详细介绍如何使用新购买的华为云 Flexus 云服务器 X 搭建,一个带商品采集功能、H5积分商城、集合拼团、砍价、秒杀、会员、分销等等功能一个茶叶商城小程序。 后端…

共享wifi公司哪家正规合法?具体流程全公开!

随着共享经济时代的到来,以共享wifi为代表的多个项目逐渐成为众多创业赛道中的一大热门,推出共享wifi及其他项目的公司数量也因此呈现出了快速增长的态势。而这也让共享wifi等市场出现了鱼龙混杂的情况,连带着共享wifi哪家公司正规合法等相关…

写作高质量文案很难,文案自动生成器轻松解决

在当今信息爆炸的网络环境中,拥有一篇高质量的文案对于吸引受众、传达信息和实现目标至关重要。然而,写作高质量文案并非易事,它需要作者具备深厚的语言功底、创新的思维以及对目标受众的精准把握。这一系列的要求常常让许多人陷入写作的困境…

Windows电脑使用VNC远程桌面本地局域网内无公网IP树莓派5

目录 前言 1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS 2. Windows安装VNC远程树莓派 3. 使用VNC Viewer公网远程访问树莓派 3.1 安装Cpolar步骤 3.2 配置固定的公网地址 3.3 VNC远程连接测试 4. 固定远程连接公网地址 4.1 固定TCP地址测试 作者简介&#xff1…

drools规则引擎

1 单个文件 这个大多搜索导的都是把规则放到一个文件&#xff0c;这个是基础&#xff0c;但是实际应用就不太方便。如果你使用的jdk1.8&#xff0c;那么对应的drools版本为7.x 1.1 pom依赖 <drools.version>7.74.1.Final</drools.version> <dependency>&…

KITTI数据集雷达采样点时间戳属性的思考(Failed to find match for field ‘time‘)

最近在SLAM调研期间&#xff0c;看到了FAST-LIO2以及Point-lio这两个比较新的SLAM建图算法&#xff0c;想着上手编译并且运行一下&#xff0c;选择了自己了解到的比较出名的数据集KITTI&#xff0c;想着在上述两个开源算法上上手跑一下&#xff08;原论文并没有使用KITTI数据集…

大功率400mw蓝光可调激光模组价格多少钱

在现代激光技术的快速发展中&#xff0c;大功率400mw蓝光可调激光模组以其卓越的性能和广泛的应用领域&#xff0c;成为了市场上备受瞩目的产品。那么&#xff0c;这款激光模组的价格究竟是多少呢? 大功率400mw蓝光可调激光模组的价格因品牌、规格、销售渠道及促销活动等因素而…

【Python报错已解决】TypeError: forward() got an unexpected keyword argument ‘labels‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【机器学习】决策树算法

目录 算法引入 基尼系数&#xff1a; 决策树算法概述 决策树的关键概念 决策树的构建 代码实现 1. 定义决策树节点 2. 计算信息增益 3. 选择最佳分割特征 4. 构建决策树 5. 决策树预测 决策树的评估指标&#xff1a; 决策树的优缺点 优点&#xff1a; 缺点&…

Github优质项目推荐-第一期

文章目录 Github优质项目推荐一、【free-for-dev】&#xff0c;88.4k stars二、【linux-command】&#xff0c;31.5k stars三、【system-design-primer】&#xff0c;270k stars四、【GitHub-Chinese-Top-Charts】&#xff0c;99.1k stars五、【Docker-OSX】&#xff0c;46k st…

汇智生物---农业与植物基因组分析专家

1.博导团队免费指导设计 2.博导团队免费解读实验结果 3.实验整体!打包服务 4.实验整体!打包服务 表观组 互作组 DNA亲和纯化测序 DNA亲和纯化测序技术通过体外表达转录因子鉴定转录因子结合位点&#xff0c;不受抗体和物种限制&#xff0c;且具有高通量的优势。DAP-Seq将蛋…

鸿萌数据恢复:NAND 内存协议,SDR 与 DDR 之间的区别

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 从事 NAND 数据恢复的人都知道&#xff0c;读取 NAND 需要使…

不可错过的10款文件加密软件,2024最新文件加密软件排行榜

在数字化时代&#xff0c;数据安全变得尤为重要。无论是个人用户还是企业组织&#xff0c;保护敏感文件和数据免受未经授权的访问是至关重要的。文件加密软件通过将文件内容转换为不可读的格式&#xff0c;确保只有授权用户才能解密和访问数据。本文将为您介绍2024年不可错过的…

828华为云征文 | 在华为云上通过Docker容器部署Elasticsearch并进行性能评测

目录 前言 1. 华为云X实例介绍及优势 1.1 柔性算力 1.2 vCPU和内存的灵活配比 1.3 成本效益与性能 2. 安装并运行 Docker 2.1 修改仓库配置文件 2.2 安装 Docker 2.3 启动 Docker 3. 使用Docker部署Elasticsearch 3.1 拉取Elasticsearch镜像 3.2 启动Elasticsearch…

数据结构算法题

目录 轮转数组原地移除数组中所有元素val删除有序数组中的重复项合并两个有序数组 轮转数组 思路1&#xff1a; 1.利用循环将最后一位数据放到临时变量&#xff08;n&#xff09;中 2.利用第二层循环将数据往后移一位 3.将变量&#xff08;n&#xff09;的数据放到数组第一位 时…

React 启动时webpack版本冲突报错

报错信息&#xff1a; 解决办法&#xff1a; 找到全局webpack的安装路径并cmd 删除全局webpack 安装所需要的版本