【JVM】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.rhkb.cn/news/434206.html

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

相关文章

24年下重庆事业单位考试报名超详细流程

🎈提交报考申请 考生通过重庆市人力资源和社会保障局官网(rlsbj.cq.gov.cn)“热点服务”中“人事考试网上报名”栏进行报名。报名时间为2024年8月12日9:00—8月17日9:00。 🎈网上缴费 资格初审合格后,考生应在2024年8…

奇瑞汽车—经纬恒润 供应链技术共创交流日 成功举办

2024年9月12日,奇瑞汽车—经纬恒润技术交流日在安徽省芜湖市奇瑞总部成功举办。此次盛会标志着经纬恒润与奇瑞汽车再次携手,深入探索汽车智能化新技术的前沿趋势,共同开启面向未来的价值服务与产品新篇章。 面对全球汽车智能化浪潮与产业变革…

讯飞星火编排创建智能体学习(一)最简单的智能体构建

开篇 前段时间在华为全联接大会上看到讯飞星火企业级智能体平台的演示,对于拖放的可视化设计非常喜欢,刚开始以为是企业用户才有的,回来之后查了才知道个人用户也能使用。不过有关编排智能体的介绍特别少,也没有找到文档&#xf…

docker入门总结(附错误处理,持续更新)

安装、启动、卸载 卸载掉旧版本的 Docker yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engineDocker安装(选其一)…

Tableau|一入门

一 什么是BI工具 BI 工具即商业智能(Business Intelligence)工具,是一种用于收集、整理、分析和展示企业数据的软件系统,其主要目的是帮助企业用户更好地理解和利用数据,以支持决策制定。 主要功能: 1.数据…

LeetCode 每周算法 8(栈、堆)

LeetCode 每周算法 8(栈、堆) 栈算法: class Solution { public: // 判断括号是否有效的函数 bool isValid(string s) { int n s.size(); // 获取字符串s的长度 // 如果字符串长度为奇数,则括号无法有效匹配,直…

【Linux网络】详解TCP协议(3)

🎉博主首页: 有趣的中国人 🎉专栏首页: Linux网络 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 TCP的流量控制和滑动窗口 的相关内容。 如果看到最后您觉得这篇…

性能测试学习1:性能测试的理论与目的,与功能测试的区别

一.什么是性能? 1)性能:就是软件质量属性中的“效率”特性 2)效率特性: ①时间特性:表示系统处理用户请求的响应时间【通俗来说,就是使用系统是否流畅】 ②资源特性:表示系统运行过程中&…

锐捷 NBR 1300G路由器 越权CLI命令执行漏洞

漏洞描述 锐捷NBR 1300G路由器 越权CLI命令执行漏洞,guest账户可以越权获取管理员账号密码 漏洞复现 FOFA title"锐捷网络 --NBR路由器--登录界面" 请求包 POST /WEB_VMS/LEVEL15/ HTTP/1.1 Host: Connection: keep-alive Content-Length: 73 Autho…

Python爬虫之requests模块(一)

Python爬虫之requests模块(一) 学完urllib之后对爬虫应该有一定的了解了,随后就来学习鼎鼎有名的requests模块吧。 一、requests简介。 1、什么是request模块? requests其实就是py原生的一个基于网络请求的模块,模拟…

封装左侧抽屉可拖拽组件【可多个】

一、案例效果 二、案例代码 封装抽屉组件 <template><div class"drag-drawer"><div class"out-box" :style"style"><mtd-tooltip:content"collapse ? 展开面板 : 收起面板"class"tool-tip":placeme…

AI周报(9.22-9.28)

AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机&#xff0c;旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法&#xff0c;能够自动识别和分析家中宠物的行为&#xff0c;并提供定制化的护理建议。 SiiPet相机的核心功…

GUI-Guider LVGL 添加自定义代码

添加自定义代码时&#xff0c;分为上线两端 1.上部分可有可无 2.下部分为你触发事件时调用的语句 具体集合下方图片 示例参考

Python入门:掌握inspect模块,轻松调试你的代码!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 什么是inspect模块?📝 inspect模块的常用方法📝 1. 获取对象的信息📝 2. 获取函数的参数📝 3. 检查对象类型📝 4. 获取文档字符串📝 5. 获取调用方法的名称📝 实际应用场景⚓️ 相关链接 ⚓️…

[大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作

​​​​​​Generation of Complex 3D Human Motion by Temporal and Spatial Composition of Diffusion Models L Mandelli, S Berretti - arXiv preprint arXiv:2409.11920, 2024 通过时间和空间组合扩散模型生成复杂的3D人物动作 摘要 本文提出了一种新的方法&#xff0…

Spring AOP - 注解方式实现

前文已经讨论了基于配置文件方式实现Spring AOP&#xff08;Spring AOP - 配置文件方式实现&#xff09;&#xff0c;本文采用注解的方式实现前文相同的功能。配置步骤如下&#xff1a; 1、项目增加aop依赖&#xff08;pom.xml) <dependency><groupId>org.springfr…

linux 安装 tomcat9、java环境

一、安装 Java环境 1. 下载文件 https://repo.huaweicloud.com/java/jdk/ 或者网盘&#xff1a;通过网盘分享的文件&#xff1a;jdk-8u192-linux-x64.tar.gz 链接: https://pan.baidu.com/s/1V3pQWzgSLJxdrUdmmKueRA 提取码: qspw 2. 查看Linux系统是否有自带的jdk&#xf…

代码随想录_刷题记录_第四次

二叉树 — 理论基础 种类&#xff1a; 满二叉树&#xff08;所有层的节点都是满的&#xff0c;k&#xff1a;深度 节点数量&#xff1a;2^k - 1&#xff09;完全二叉树&#xff08;除了最后一层&#xff0c;其余层全满&#xff0c;并且最后一层从左到右连续&#xff09;二叉搜…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端安装Linux参考 建议还是国外教材学习…人家的PPT比…

【ESP32】Arduino开发 | I2C控制器+I2C主从收发例程

有关I2C控制器的详细介绍放在了IDF开发的文章中&#xff0c;跳转栏目目录可以找到对应的文章。 1. API Arduino启动时就已经实例化了两个I2C设备类&#xff0c;分别对应Wire和Wire1对象。 1.1 初始化 bool begin(int sda, int scl, uint32_t frequency0); // returns true, i…