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

什么是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.mzph.cn/news/878479.shtml

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

相关文章

PyCharm中python语法要求——消去提示波浪线

PyCharm中python语法要求——消去提示波浪线 关闭代码规范检查 在Setting里边搜索pep,取消勾选pep8 coding style violation 问题产生 解决问题 按照下图操作,也可直接CtrlAlts弹出设置页面 在 Settings 中 : Editor > Color Sheame >…

Nginx: TCP建立连接的优化和启用Fast Open功能

TCP 建立连接优化 在三次握手中,相关TCP的内核参数可优化这一过程 net.ipv4.tcp_syn_retries 6net.ipv4.tcp_synack_retries 5net.ipv4.tcp_syncookies 0net.ipv4.tcp_max_syn_backlognet.core.somaxconnnet.core.netdev_max_backlog 1 ) net.ipv4…

书生大模型实战营(1)——InterStudio基础知识+Vscode SSH连接远程服务器+Linux基础指令

参加书生.浦江大模型实战训练营,学习大模型知识和微调技术,所有课程免费,通过闯关的形式学习,也比较有趣。一起来了解LLM的世界。邀请链接 产品简介 InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法…

【工控】线扫相机小结 第二篇

背景 上一篇中《线扫相机小结》中介绍了一些基础知识和注意事项,这一篇是对上一篇的进一步补充。 会介绍线扫相机的一些调试技巧。 如何在线调试? 我们知道,线扫相机不能像面阵相机一样实时的呈现图像,只能一行行的扫描&#x…

HX711—称重模块

1、简介 HX711 采用了海芯科技集成电路专利技术, 是一款专为高精度电子秤而设计的 24 位 A/D 转 换器芯片。 2、原理图 PCB参考设计原理图 3、模块驱动代码(固件库) 数据读取代码分析 HX711信号读取时序 初始化: 将 PD_SCK&…

原生冻结进程分析(U)

一、概要 1.定义: 当应用切换到后台并且没有其他活动时,系统会在一定时间内通过状态判断,将进程 ID 迁移到冻结的 cgroup 节点上,实现冻结 CACHE 应用。这项功能可以减少活跃缓存应用在后台存在时所消耗的 CPU 资源,从…

armv8 memory model概述

概述 在armv8 架构中,它引入了更多的维度来描述内存模型,从而在此基础上进行硬件优化(但其中一些并未被主流的软件所接受),在此做一些简单的整理,更多信息请参考 Arm spec 以及 AMBA 协议。下文主要是对Memory 和 Device 两大类的…

基于nodejs+vue+uniapp的摄影竞赛小程序

开发语言:Nodejs框架:expressuniapp数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:VS Code 系统展示 管理员登录 管理员主界面 用户管理 书籍分类管理 书籍信息管理 系统管理…

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

fl studio 21/24破解版(水果音乐制作软件24) v24.1.1.4285附安装教程

fl studio 21/24破解版&#xff0c;又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#x…

Cmake之1.0版本重要特性及用法实例(八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

GoodSync Business - 企业级服务器同步与备份工具

现在越来越多公司会搭建服务器&#xff0c;或自建文件共享中心。那么如何才能实现对这些终端的高效管理、安全备份&#xff0c;以保障企业数据的安全呢&#xff1f; GoodSync Business 就是一款企业服务器同步与备份工具&#xff0c;适用于 Win / Mac 工作站&#xff0c;以及 …

Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解

【1】概述 Apache Kafka 是一个分布式流处理平台&#xff0c;它允许你发布和订阅记录流&#xff0c;存储记录流&#xff0c;并且可以对这些记录流进行处理。在 Kafka 中&#xff0c;消息被发布到特定的主题&#xff08;topic&#xff09;&#xff0c;然后由消费者&#xff08;…

Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡

线性模型&#xff08;Linear model&#xff09; 通常模型的修改来自于对问题的理解&#xff0c;即领域知识 基本定义&#xff1a;把输入特征x乘上一个权重&#xff0c;再加上一个偏置就可以得到预测的结果。 优点&#xff1a;简单易理解&#xff0c;可理解性好&#xff08;权重…

算法基础-位运算

>> &#xff08;右移运算&#xff09; x >> y&#xff1a;表示将x的二进制值右移y位。 正数是直接右移y位&#xff0c;则高位&#xff08;最左边&#xff09;补y个0。 负数是求补码&#xff0c;然后右移y位&#xff0c;最高位补y个1&#xff0c;再求反码&#xff…

集成电路学习:什么是DAC数模转换器

DAC&#xff1a;数模转换器 DAC&#xff0c;全称Digital-to-Analog Converter&#xff0c;即数模转换器&#xff0c;是一种电子设备或电路&#xff0c;用于将数字信号转换为相应的模拟信号。在现代电子系统中&#xff0c;DAC扮演着至关重要的角色&#xff0c;它实现了数字电路与…

如何在UE5.4中重新定位动画?

动画在游戏和电影制作中扮演着至关重要的角色&#xff0c;而在虚幻引擎5.4&#xff08;UE5.4&#xff09;这一强大的实时3D创作平台中&#xff0c;重新定位动画的能力更是将创意表达推向了新的高度。本文将引导您探索UE5.4中重新定位动画的技巧&#xff0c;确保您的动画作品不仅…

Unity | 基础知识

装箱和拆箱&#xff1a; 获取对方的类型&#xff1a; GetType通过打点调用 as进行类型转换 运用Convert进行类型转换&#xff1a; 二维数组的定义 结构体类型 不同名称空间来调用&#xff1a;

Auto-Unit-Test-Case-Generator -- java项目自动测试生成

0.Pre-预备知识&#xff1a; 0.1.Maven是什么&#xff1f; [by Maven是什么&#xff1f;有什么作用&#xff1f;Maven的核心内容简述_maven是干什么用-CSDN博客 ] 是Java 领域中最流行的自动化构建工具之一&#xff0c;Maven 作为 Java 项目管理工具&#xff0c;具有: 包管…

互联网全景消息(1)之RabbitMq基础入门

一、消息中间件 1.1消息队列回顾 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实 现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ &a…