JVM面试(一)什么是虚拟机?什么是class文件?

news/2024/9/18 10:14:37/ 标签: jvm, 面试, 职场和发展, jvm面试, java虚拟机

什么是java虚拟机

如果通俗点来讲,我们在电脑上一行行敲出来的代码,电脑本身是不认识的,最终是要转成电脑可以运行的101001这种字节。

但是这些我们又不可能手动来转换,所以呢,就需要一个工具,来将我们敲出来的代码,转换成电脑可以认识的命令来进行执行。

为了使用方便,就把这个可实时运行的程序,封装取来,拿到任何地方都可以使用。而且因为最支持的语言就是java,所以取一个名字叫做java虚拟机

那在真正使用的时候,我们到底有接触吗?

有, 就是每个java开发人员都要在电脑上安装的运行环境,JRE,这个就包含了java的虚拟机,还有一些基础的类库(也就是基础的jar包)。
那有的同学就说了,我们没有安装JRE,只安装了JDK啊。

对,JDK中,包含了java开发时候一些常用的工具包(jar/lib),同时还包含了JRE,以及编译器,
编译器就是我们配置jdk环境之后,都会输入的一个命令“javac”,作用就是将我们的开发文件".java" ,编译为".class"

".class"文件就是虚拟机运行时候可识别的文件,也就是说我们开发是java文件,虚拟机运行之前将其先编译为class文件,用这些class文件在虚拟机中运行,与计算机本身产生交互。

什么是跨平台?

为什么java语言可以实现跨平台? 就是因为编译之后,可以带着虚拟机,在任何地方运行。
并且,其他语言中,只要编译为class文件,都可以在虚拟机中运行,这样就能与java文件产生交互,这就叫跨平台,如下图:
在这里插入图片描述
也就是说,其实java虚拟机,并不是与java语言强相关。其他语言只要编译为class文件,就都可以在java虚拟机中运行,这个就叫做跨平台。

什么是class文件?

就是上面我们说过的,java虚拟机可识别的文件,由我们开发出来的java文件编译出来。
结构如下
在这里插入图片描述

  • ⽆符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个 字节的⽆符号数,⽆符号数可以⽤来描述数字、索引引⽤、数量值或者按照UTF-8编码构成字符串值。
  • 表是由多个⽆符号数或者其他表作为数据项构成的复合数据类型,为了便于区分,所有表的命名都习惯性地以“_info”结尾。表⽤于描述有层次关系的复合结构的数据,整个Class⽂件本质上也可以视作是⼀张表,这张表由表6-1所示的数据项按严格顺序排列构成。

魔数和主次版本号

魔数固定为CAFEBABE
次版本号在jdk12之前均没被使⽤,默认为0。主版本号如jdk8中对应为⼗进制的版本号为52;

常量池

(constant_pool_count)常量池计数器,从1开始计数,表示class中常量池的⼤⼩。
常量池中主要存放两⼤类常量:字面量(Literal)和符号引用(Symbolic References)。字面量比较接近于Java语⾔层⾯的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则属于编译 原理方面的概念,主要包括下面几类常量:

  • 被模块导出或者开放的包(Package)
  • 类和接⼝的全限定名(Fully Qualified Name)
  • 字段的名称和描述符(Descriptor)
  • ⽅法的名称和描述符
  • ⽅法句柄和⽅法类型(Method Handle、Method Type、Invoke Dynamic)
  • 动态调⽤点和动态常量(Dynamically-Computed Call Site、Dynamically Computed Constant)

Java代码在进行Javac编译的时候,并不像C和C++那样有“连接”这⼀步骤,而是在虚拟机加载Class 文件的时候进行动态连接。也就是说,在Class文件中不会保存各个方法、字段最终在内存中的布局信息,这些字段、方法的符号引用不经过虚拟机在运行期转换的话是无法得到真正的内存入口地址,也就无法直接被虚拟机使用的。当虚拟机做类加载时,将会从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中。

PS:上面这段话有点拗口,简单总结来说,就是虚拟机的运行并不直接与内存产生联系,而是在的请求创建的线程中,再与内存产生联系,线程拿到数据拷贝进行处理。

访问标志

在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接接口;是否定义为public类型;是否定义为abstract 类型;如果是类的话,是否被声明为final;等等

类索引、父类索引与接口索引集合

  • 类索引(this_class)和父类索引(super_class)都是⼀个u2类型的数据,而接口索引集合(interfaces)是⼀组u2类型的数据的集合,Class文件中由这三项数据来确定该类型的继承关系。
  • 类索引用于确定这个类的全限定名,父类索引⽤于确定这个类的父类的全限定名。
  • 由于Java语⾔不允许多重继承,所以父类索引只有⼀个,除了java.lang.Object之外,所有的Java类都有父类,因此除了java.lang.Object外,所有Java类的⽗类索引都不为0。
  • 接⼝索引集合就⽤来描述这个类实现了哪些接口,这些被实现的接⼝将按implements关键字(如果这个Class⽂件表示的是⼀个接口,则应当是extends关键字)后的接口顺序从左到右排列在接口索引集合中。

字段表集合

字段表(field_info)用于描述接⼝或者类中声明的变量。Java语⾔中的“字段”(Field)包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。

方法表集合

方法表⽤于描述接⼝或类中声明的方法。⽅法表的结构如同字段表⼀样,依 次包括访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes)几项。

对于方法里的Java代码,经过Javac编译器编译成字节码指令之后,存放在方法属性表集合中⼀个名为“Code”的属性里面

属性表集合

属性表(attribute_info)。Class文件、字段表、方法表都可以携带自己的属性表集合,以描述某些场景专有的信息。


http://www.ppmy.cn/news/1519205.html

相关文章

学习笔记——后端项目中的相关技术 【随时更新】

文章目录 1. Session 共享1.0 cookie和session的工作流1.1 Cookie范围1.2 为什么要共享?1.3 如何共享存储1.4 session共享实现 2. 缓存的实现2.1 缓存分类2. 2 Redis 缓存实现2.1.1 Redis 的数据结构(高频考点)2.1.2 redisTemplate 自定义序列…

【Linux】CodeServer:离线插件配置

下载 VS Code 插件 要为 code-server 添加离线插件,首先需要从 Visual Studio Code 插件市场下载所需的插件: 打开浏览器,访问 Visual Studio Code 插件市场。 在搜索栏中输入您需要的插件名称,找到插件后,点击插件页…

“线程池中线程异常后:销毁还是复用?”

目录 一、验证execute提交线程池中 测试 结论 二、验证submit提交线程池中 测试 结论 三、源码解析 查看submit方法的执行逻辑 查看execute方法的执行逻辑 为什么submit方法,没有创建新的线程,而是继续复用原线程? 四、总结 需要说…

经典大语言模型解读(2):生成式预训练的先锋GPT-1

论文地址:Improving Language Understanding by Generative Pre-Training 概述 现实世界中包含了大量的文本语料数据,然而,绝大多数语料都是无标签的。 为了充分利用这些无标签语料库,GPT1.0提出直接利用这些未标记的语料来进行…

VMware Workstation安装及配置CentOS7 Linux操作系统

VMware workstation安装 百度网盘,VMware-workstation-full-17.5.2.exe 安装包: 链接:https://pan.baidu.com/s/1xgbWUlo-hFUbb11MRxIVsw?pwd87bq 提取码: 87bq 检查网络适配器是否正常配置 在VMware Workstation中安装CentOS7 Linux操作系统 下载…

探秘Python字典:解锁数据管理的艺术

引言 字典(Dictionary)是一种可变容器模型,它可以存储任意类型对象。Python字典使用键-值对(key-value pair)存储数据,其中键必须是不可变的数据类型如数字、字符串等,而值可以是任何数据类型。…

花店鲜花管理与推荐系统+Python+Django网页界面+管理系统+计算机课设

一、介绍 花店鲜花管理与推荐系统。本系统使用Python作为主要开发语言开发的一个花店鲜花管理与推荐的网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求,并将用户的相关行为数据保存在数据库中。通过Ajax技…

泰山派的小手机后续(2)

之前 触摸板一直报错的解决: 1 我的触摸板 画错了。 从新画了一个 触摸的转接板,调整过来了。 关于触摸的 线序。 这块屏幕正常 就是横着放的。 关于泰山派接口的线序: 所以我的转接板的画法 是: 开发板与转接板 使用的是 反排线…

AWS 无服务计算服务 Lambda

无服务计算服务 Lambda 引言什么是 AWS Lambda关键特点使用场景 SQS 驱动 Lambda示例场景描述:订单处理系统解决方案:使用 SQS 和 Lambda示例代码:Python Lambda 处理 SQS 消息总结 Lambda ApplicationLambda Application 的主要组成部分创建…

“北京地铁系统中人脸识别技术的安全与效率问题研究”

关于“北京地铁系统中人脸识别技术的安全与效率问题研究”,可以从以下几个方面进行详细分析: 一、人脸识别技术在北京地铁系统中的应用 1. 安检系统 应用背景:为了提升地铁进站安检速度,减少乘客等候时间,北京地铁系…

深度学习速通系列:线性回归vs逻辑回归

线性回归和逻辑回归是两种常用的统计学方法,它们在数据分析和机器学习中扮演着重要的角色。下面是对这两种回归方法的基本介绍: 线性回归(Linear Regression): 线性回归是一种预测分析方法,用于建模和分析…

基于单片机的无线空气质量检测系统设计

本设计以STC89C52单片机为核心,其中包含了温湿度检测模块、光照检测模块、PM2.5检测模块、报警电路、LCD显示屏显示电路、按键输入模块和无线传输模块来完成工作。首先,系统可以通过按键输入模块设置当前的时间和报警值;使用检测模块检测当前…

Java中的事件驱动架构(EDA)

引言 在现代软件开发中,事件驱动架构(Event-Driven Architecture, EDA)越来越受到青睐。EDA是一种软件架构范式,它通过生成、捕获和反应事件来驱动系统行为。在大型分布式系统中,EDA能够帮助我们提高系统的可扩展性、…

Golang 教程6——数组

Golang 教程6——数组 注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点 1、赋值 1.1 main文件 func main() {//赋值方式1var arr [5] intarr[0] 1arr[1] 2arr[2] 3arr[3] 4arr[4] 5fmt.Println(arr)//赋值方式2var arr2 …

spring security 记住我在web和前后端分离如何使用

一、传统web开发准备工作 如果不懂原理的话,去看上一篇文章:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/141716695 导入需要的依赖包,在传统web页面开发比较简单,我们设置只需要在页面请求参数加上一个remember-me 即可&a…

VS实用的调试技巧

目录 前言 一、是什么bug? 二、什么是调试(Debug) 三、Debug和Release 四、VS调试快捷键 4.1 环境准备 4.2 调试快捷键 五、监视和内存观察 5.1 监视 5.2 内存 六、举例 6.1 例一 6.2 例二 七、数组传参小技巧 八、编程常见错误归类 1. 编译型错误 …

【设计模式-职责链】

定义 职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它避免请求的发送者与接收者耦合在一起,让多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有对象…

嵌入式Linux:信号分类

目录 1、不可靠信号与可靠信号 1.1、不可靠信号 1.2、可靠信号 2、实时信号和非实时信号 2.1、非实时信号 2.2、实时信号 在Linux系统中,信号可以从两个不同的角度进行分类:一是从可靠性方面,将信号分为可靠信号与不可靠信号&#xff1…

【drools】Rulesengine构建及intelj配置

7.57.0.FinalRulesengineApplication 使用maven构建 intelj 打开文件资源管理器实在是太慢了所以直接把pom 扔到其主页识别为maven项目,自动下载maven包管理器 然后解析依赖: 给maven加一个代理 -DproxyHost=127.0.0.1 -DproxyPort=7890 还是卡主

Python DBUtils介绍

在Python的数据库编程中,高效、安全地管理数据库连接是至关重要的一环。DBUtils是一个Python模块,它提供了一套工具,旨在简化数据库连接的获取、重用和释放过程,从而提高应用程序的性能和可维护性。本文将详细介绍DBUtils的功能、…