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

news2024/12/25 9:24:48

是什么

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.coloradmin.cn/o/2160591.html

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

相关文章

爆火南卡开放式耳机,音质性能霸榜TOP1,行业唯一达专业HiFi级音质标准!

爆火南卡开放式耳机,音质性能霸榜TOP1,行业唯一达专业HiFi级音质标准! 随着科技的不断进步,耳机市场迎来了又一次革命性的创新。南卡(NANK)品牌近日宣布,其最新力作——南卡Ultra耳夹开放式耳机…

大模型榜单汇总整理

大型语言模型(LLM)评估榜单提供了对不同模型性能的标准化比较,涵盖了从通用能力到特定领域应用的多个方面。这些榜单专注于评估模型在特定领域的应用能力,有助于开发者了解模型的优势和局限性,推动语言模型的发展和优化…

彩虹表攻击

彩虹表攻击是一种通过查找预计算哈希值来破解密码的技术。攻击者会生成一个包含大量常见密码及其哈希值的查找表,随后将这些哈希值与数据库中的密码哈希进行匹配,从而快速找出对应的明文密码。该攻击方法特别适用于使用弱密码且未进行加盐处理的系统。 相…

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】

Spring Cloud Alibaba-(1)搭建项目环境 Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-(3)OpenFeign【服务调用】 Spring Cloud Alibaba-(4)Sen…

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…

在Windows系统上安装的 Arrow C++ 库

在Windows系统上安装的 Arrow C 库 正文第一步第二步第三步第四步注: 检查是否安装成功 吐槽 正文 第一步 git clone gitgithub.com:apache/arrow.git第二步 打开powershell (好像cmd也可以,不过我试了powershell中不报错,cmd中报错,不是很清楚为什么) 打开arrow的目录 cd …

利士策分享,如何培养良好的工作习惯?

利士策分享,如何培养良好的工作习惯? 在这个快节奏、高压力的职场环境中,培养良好的工作习惯不仅关乎个人职业发展的顺畅度, 更是提升工作效率、保持身心健康的关键。 以下是一些实用的建议,帮助你在日常工作中逐步构…

fiddler监听安卓http请求

下载安装Fiddler 官网 配置 选择Options 打开模拟器找到设置 打开app请求就能实现接口的监听了 https需要单独处理 参考 https://blog.csdn.net/lengdaochuqiao/article/details/88170522

靠AI视频在短视频平台接单月入过万,她怎么做到的?AI视频真的来了

大家好,我是画画的小强 相信大家和我一样,从小也有一个导演梦,感谢AI时代,替我完成了这个梦想,如果你想知道如何实现的,今天这篇文章,你一定要看完! 从去年11月份起,随…

MISC - 第三天(MSB二进制高地址位,ASCII编码,brainfuck编码)

前言 各位师傅大家好,我是qmx_07,今天继续讲解MISC题目 被嗅探的流量 观察题目信息,猜测可能是通过http网址传输文件,也可以查询内网ip进行筛查 过滤http协议,发现upload.php路径 查询POST提交请求 在第二条数据里…

【Python报错已解决】NameError: name ‘reload‘ is not defined

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

开学季好物合集!带你揭秘2024最全数码好物清单!学生党必看!

开学季总是令人充满期待与憧憬。对于学生党来说,拥有合适的学习装备和数码好物,不仅能提升学习效率,还能为校园生活增添诸多便利与乐趣。在科技飞速发展的今天,数码产品的更新换代日新月异,市场上琳琅满目的数码好物让…

数据结构算法题

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

slam入门学习笔记

SLAM是Simultaneous localization and mapping缩写,意为“同步定位与建图”,主要用于解决机器人在未知环境运动时的定位与地图构建问题,目前广泛用于机器人定位导航领域,VR/AR方面,无人机领域,无人驾驶领域…

9.23每日作业

仿照string类&#xff0c;自己手动实现 My_string list.h #ifndef LIST_H #define LIST_H #include <iostream>using namespace std;class My_string { private:char *ptr;int size;int len;public://无参构造My_string();//有参构造My_string(const char * src);My_st…

哈希——字符串哈希

回顾/本期梗概 上期我们学习了图论基础&#xff08;空降链接&#xff09;&#xff0c;本期我们将学习哈希中的字符串哈希。 1、什么是哈希 哈希算法是&#xff1a;通过哈希函数讲字符串、较大的数等转换为能够用变量表示的或者是直接能作为数组下标的数&#xff0c;通过哈希算法…

代码随想录算法训练营Day13 | 递归遍历、迭代遍历、层序遍历

目录 递归遍历和迭代遍历&#xff1a; 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 层序遍历&#xff1a; 102.二叉树的层序遍历 107.二叉树的层序遍历Ⅱ 199.二叉树的右视图 637.二叉树的层平均值 429.N叉树的层序遍历 515.在每个树行中找最大…

计算机组成体系与组成结构错题解析【软考】

目录 前言进制转换码制补码 CPU的组成输入/输出技术中断相关概念输入/输出技术的三种方式比较周期相关知识 主存编址计算流水线技术层次化存储体系可靠性 前言 本文专门用来记录本人在做软考中有关计算机上组成体系与组成结构的错题&#xff0c;我始终认为教学相长是最快提高的…

0-1开发自己的obsidian plugin DAY 2

今天上午解决了三个问题 1. typescript长得丑/一片飘红/格式检查太严格 在vscode的settings里搜索下面这个然后false掉&#xff1a; "typescript.validate.enable": false 就不会一片飘红了&#xff08;其他下载第三方插件如TSLint和typescript hero的方法都不好使&…

众数信科 AI智能体政务服务解决方案——寻知智能审查系统

政务服务解决方案 寻知智能审查方案 融合检察院起诉文书审查要求 能智能识别文书格式、内容缺失等错误 标记出不符合数百项监督提示点的内容 给出法律依据&#xff0c;正确率95% 3分钟助检察官完成起诉书审查 众数信科AI智能体 产品亮点 分析、理解行业知识和校验规则 A…