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

news2024/9/27 5:44:52

什么是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.coloradmin.cn/o/2089510.html

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

相关文章

关于redis存储数据类型选择

项目使用的spring-boot,操作redis使用的是spring redis的api 在序列化的时候,如果往redis存入的是比较小的数字,反序列化的时候,会是integer类型 如果字段定义的是Long类型,因为比较小,所以被反序列化成i…

Cadence高速板设计技巧(全志H3)

市场上一般的电视屏幕是4K的: cadence查找: 右侧的面板FIND里面输入要查找的名字就可以进行查找。 全局查找需要鼠标点击到.DSN的,进入全局。 在视图里选择一个层就可以单独查看这个层的东西,屏蔽掉其他层的东西: 共…

linux命令:用于删除空目录的命令行工具rmdir详细介绍

目录 一、概述 二、用法 1、基本语法 (1)选项 (2)目录... 2、主要选项 (1)-p, --parents (2) -v, --verbose (3) -h, --help (4&#x…

Mysql基础练习题 596.查询至少有5个学生的所有班级 (力扣)

596.查询至少有5个学生的所有班级 建表插入数据: Create table If Not Exists Courses (student varchar(255), class varchar(255)) Truncate table Courses insert into Courses (student, class) values (A, Math) insert into Courses (student, class) value…

指针进阶(多级指针)

0.多级指针命名 多级指针命名,最主要的是要知道该指针指向的是什么数据。 一.1级指针 - 指向一个变量 若定义一个变量 int a,那么 目标类型就为 int。 所以该指针应该定义为 int *p; /* 目标 */ int a;/* 目标类型 *p */ int *p;/* 指向目标 */ p a;二…

服务器数据恢复—磁盘坏扇区导致raid6阵列崩溃的数据恢复案例

服务器存储数据恢复环境: 一台存储中有一组由12块SAS硬盘组建的raid6磁盘阵列,划分了1个卷,由数台Vmware ESXI主机共享存储。卷中存放了大量的Windows系统虚拟机。这些虚拟机系统盘大小一致,数据盘大小不确定,数据盘都…

安卓主板_MTK安卓主板定制_联发科主板/开发板方案

这款安卓主板采用了联发科的MTK8788、MTK8768及MTK8766系列芯片平台,运用了64位四核/八核 Cortex-A53/A73架构,主频高达2.0 GHz。主板配置了4GB LPDDR3内存和64GB eMMC存储,同时配备了ARM Mail-T450 MP2图形处理单元(GPU),使其在4…

PbootCMS程序安全设置建议

近期遇到部分使用PbootCMS开源程序的客户反馈网站被挂马/入侵等情况,我司核实原因是由于此程序存在漏洞,用户可以按照以下建议进行安全设置。 虚拟主机 一、程序建议: 1、登录后台,将程序升级到最新版本,密码重置为…

算力网络痛点;对象存储OSS;CPN功能模块

目录 算力网络 算力网络痛点:度量困难、种类繁多、分布广泛、归属复杂。 CPN功能模块 对象存储OSS 算力网络 在分析算力资源的特点前,我们首先要明确算力的概念。算力,也称为计算力或计算能力。该词的最早来源已经不可查证,互联网上的资料大多与区块链相关。这是因为区…

MyBatis拦截器面试题

JDBC的执行流程 (面试题一) MyBatis执行流程(面试题二) (我的猜测:1执行器通过工厂执行Mapper类,,2.语句映射器处理mappe文件成对象,3把前端传过来的参数映射到对象里,4输出结果映射) Mybatis拦截器(四个) 拦截的执行顺序是Execu…

ubuntu设置为自己需要的屏幕分辨率

先说一下我处理该问题的大体背景:我是学习Linux的新手,刚学完嵌入式Linux驱动开发相关课程。现在想接着学习一下QT开发。我是在电脑上装了虚拟机之后安装的ubuntu系统。因为换了电脑,所以重新装了ubuntu系统。但是,装完ubuntu系统…

AI Agent从实操体验到代码理解

一、从体验出发 从chatbot到co-pilot,LLM应为的场景不断在扩大,形式也越来越多样化,到如今,chatbot的风头基本已过,co-pilot正在成为大模型嵌入到产品里面的主要形态,但随着PMF(产品市场契合度&…

基于asp.net的webform图书管理系统附源码

今天给大家分享一个c#的图书管理系统,采用的SQLserver数据库,VS开发,详情如下 1.主要功能 主要功能包含用户注册登陆、借书管理、还书管理、管理员登陆、个人中心 、密码修改、图书分类、图书管理等等。2.开发工具及其环境 系统采用VS2013…

MySQL批量插入测试数据的2种方式

在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者学习验证某一知识点经常需要一些测试数据, 这个时候如果手敲的话, 十行二十行还好, 多了就很死亡了, 接下来介绍两种常用的MySQL测试数据批量生成方式: 存储方式函数 Navicat的数据生成…

投屏软件哪个好用又免费?4款投屏软件,远程且兼容多平台!

投屏软件哪个好用又免费?不论是在工作中做演示、在家中娱乐观影,还是在学习中进行远程教学,投屏软件都能让你的设备实现多屏互动,让体验更为流畅和便捷。今天,我就为大家推荐几款热门的投屏软件。 1. 乐播投屏&#xf…

第二证券:白酒股,全线飘红

A股首要指数走势分化,到午间收盘,沪指跌0.45%,深成指涨1.03%,创业板指涨0.8%。近4000只个股上涨,两市半日成交3854亿元,较上日同期放量629亿元。 盘面上,光伏设备板块冲高,快可电子…

【区间dp、字符串处理】P4290 [HAOI2008] 玩具取名 题解

前言 毒瘤的字符串杂题 题意 给定 A , B , C , D ( A , B , C , D ≤ 16 ) A,B,C,D(A,B,C,D \leq 16) A,B,C,D(A,B,C,D≤16) 四个数,依次代表 W I N G 四个字母分别能用哪些含有 W I N G 四个字母且长度为 2 2 2 的字符串表示,如以下输入样例&#…

为什么选择GHA文章作为谷歌seo的首选?

选择GHA的文章作为谷歌SEO的首选主要是因为其内容质量和优化策略,GHA专注于高质量的原创内容,这些内容不仅是原创的,还包括了超过3000字的详细信息,通过深入的关键词调研和布局,确保每篇文章都能在发布后迅速被谷歌收录…

JavaScript学习文档(11):Window对象、本地存储、数组中一些方法、学生就业统计表案例

目录 一、Window对象 1、BOM(浏览器对象模型) 2、定时器-延时函数 3、 JS执行机制 (1)同步任务: (2)异步任务: 4、location对象 (1)5秒钟后跳转页面 5、navigator对象 6、…

【uniapp/uview1.x】u-collapse 高度随内容自适应

当 u-collapse-items 中的内容为动态的时候&#xff0c;会发生这种情况&#xff1a; 在 uview 官网中有一个方法可以解决&#xff1a; 具体方法&#xff1a; 在 u-collapse 标签中配置 ref"collapse"&#xff1a; <u-collapse ref"collapse" :item-…