iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java虚拟机,类文件结构深度解析
  • 556
分享到

Java虚拟机,类文件结构深度解析

2023-06-02 17:06:57 556人浏览 薄情痞子
摘要

Java类文件结构Java虚拟机不和包括Java在内的任何语言绑定,只与 "Class文件" 这种特定的二进制文件所关联, Class文件中包含了Java虚拟机指令集合符号表以及若干其它辅助信息。 Java虚拟机作为一个

Java类文件结构

Java虚拟机不和包括Java在内的任何语言绑定,只与 "Class文件" 这种特定的二进制文件所关联, Class文件中包含了Java虚拟机指令集合符号表以及若干其它辅助信息。 Java虚拟机作为一个通用的、机器无关的执行平台,任何其他语言都可以将其作为语言的产品交付媒介。

Java虚拟机,类文件结构深度解析

 

Class类文件结构

Class文件是一组以8位字节为基础的二进制流, 各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符, 这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。

Class文件格式采用一种类似于C语言结构体的伪结构来存储数,这种伪结构有两种数据类型:

无符号数

无符号数:属于基本数据类型,以u1、u2、u4、u8来代表1个字节、2个字节、4个字节、8个字节的无符号数, 无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。

表:由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以"_info"结尾。 表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表。

  • 注意:Class文件结构不像XML等描述语言,由于它没有任何分割符号, 所以无论是数量甚至于数据存储的字节序这样的细节都被严格限定, 哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变。

魔数与Class文件版本

每个Class文件的头四个字节称为魔数(Magic Number), 它的唯一作用是确定这个文件是否为一个能被虚拟机接收的Class文件。 紧接着魔数的四个字节存储的是Class文件的版本号: 第五和第六是次版本号,第七和第八是主版本号。

Java虚拟机,类文件结构深度解析

 

常量池

紧接着主次版本号之后的是常量池入口,常量池可以理解为Class文件之中的资源仓库, 它是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一, 同时它还是在Class文件中第一个出现的表类型数据项目。 常量池主要存放两大常量:字面量和符号引用。 字面量比较接近于java语言层面的的常量概念,如文本字符串、声明为final的常量值等。 而符号引用则属于编译原理方面的概念。包括下面三类常量:

  • 类和接口的全限定名

  • 字段的名称和描述符

  • 方法的名称和描述符

由于常量池中常量的数量是不固定的,所以在常量池的入口需要设置一项u2类型的数据,代表常量池容量计数值。 与Java中语言习惯不一样的是,这个容量技术是从1而不是0开始的,如下图表示,常量池容量(偏移地址:0x00000008)

为十六进制数0x0016,即十进制22,这代表常量池中有21项常量,索引值范围为1~21。在Class文件格式规范制定之时,设计者将第0项常量空出来是有特殊考虑的,这样做的目的在于 满足后面某些指向常量池的索引值的数据在特定情况下需要表达

"不引用任何一个常量池项目"的含义,这种情况就可以把索引值置为0来表示。 Class文件结构中只有常量池的容量计数从1开始, 对于其他集合类型,包括接口索引结合,字段表集合,方法表集合等容量技术都与一般习惯相同,从0开始。

Java虚拟机,类文件结构深度解析

 

访问标志

在常量池结束之后,紧接着的两个字节代表访问标志, 这个标志用于识别一些类或者接口层次的访问信息, 包括:这个Class是类还是接口,是否为public或者abstract类型,如果是类的话是否声明为final等等。 标志位和标志的含义对应如下:

Java虚拟机,类文件结构深度解析

 

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

类索引、父类索引与接口索引集合都按顺序排列在访问标志之后, Class文件由这三项数据来确定这个类的继承关系。 类索引用于确定这个类的全限定名, 父类索引用于确定这个类的父类的全限定名,由于java语言的单继承,所以父类索引只有一个, 除了java.lang.Object之外,所有的java类都有父类,因此除了java.lang.Object外,所有java类的父类索引都不为0。 接口索引集合用来描述这个类实现了哪些接口,这些被实现的接口将按 implents(如果这个类本身是接口的话则是extends)后的接口顺序从左到右排列在 接口索引集合中。

字段表集合

字段表(field info)用于描述接口或类中声明的变量。 字段包括类变量和实例变量,但不包括在方法内部声明的局部变量。

我们可以想一想在Java中描述一个字段可以包含什么信息呢?

字段的作用域(public ,private,protected修饰符),是实例变量还是类变量(static修饰符)、 可变性(final)、并发可见性(volatile修饰符,是否强制从主内存读写)、可否被序列化(transient修饰符)、 字段数据类型、字段名称。

上述这些信息中,各个修饰符都是布尔值,要么有某个修饰符,要么没有,很适合使用标志位来表示。 而字段叫什么名字、字段被定义为什么数据类型这些都是无法固定的,只能引用常量池中常量来描述。

方法表集合

Class文件存储格式中对方法的描述与对字段的描述几乎采用了完全一致的方式。 方法表的结构如同字段表一样,依次包括了访问标志、名称索引、描述符索引、属性表集合几项。

  • 注意:因为volatile修饰符和transient修饰符不可以修饰方法, 所以方法表的访问标志中没有这两个对应的标志,但是增加了synchronized、native、abstract等关键字修饰方法, 所以也就多了这些关键字对应的标志。

属性表集合

在Class文件,字段表,方法表中都可以携带自己的属性表集合,以用于描述某些场景专有的信息。 与Class文件中其它的数据项目要求的顺序、长度和内容不同,属性表集合的限制稍微宽松一些, 不再要求各个属性表具有严格的顺序,并且只要不与已有的属性名重复, 任何人实现的编译器都可以向属性表中写入自己定义的属性信息,Java虚拟机运行时会忽略掉它不认识的属性。

字节码指令简介

字节码与数据类型

在java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息, 例如iload指令用于从局部变量表中加载int类型的数据到操作数栈中,而fload指令加载的则是float类型的数据。 这两条指令的操作在虚拟机内部可能是同一段代码实现的,但在Class文件中它们必须拥有各自独立的操作码。

大部分的指令都没有支持整数类型byte、char、short甚至没有任何指令支持boolean类型。 大多数对于byte、char、short、boolean类型的操作,实际上都是使用相应的int类型作为运算符类型。

加载和存储指令

加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。

Java虚拟机,类文件结构深度解析

 

运算指令

运算或算术指令用于对操作数栈上的值进行某种特定运算,并把结果重新存入操作栈顶。

大体上算术指令可以分为两种: 对整型数据和对浮点数据进行运算指令。 (由于没有byte、char、short、boolean类型,所以对这类数据的运算应使用int类型指令代替)

类型转换指令

类型转换指令可以将两种不同的数值类型进行相互转换。 (比如int类型转换为float类型) 小范围到大范围类型安全转换,无需显式的转换指令,否则必须显式的使用转换指令来完成。

对象创建与访问指令

虽然类实例和数组都是对象,但java虚拟机对类实例和数组的创建和操作使用了不同的字节码指令。

Java虚拟机,类文件结构深度解析

 

操作数栈管理指令

如同操作数据结构中的栈一样,Java虚拟机也提供了一些用于直接操作操作数栈的指令。

Java虚拟机,类文件结构深度解析

 

控制转移指令

可以认为控制转移指令就是在有条件或无条件地修改PC寄存器的值。

方法调用和返回指令

invokevirtual 指令用于调用对象的实例方法invokeinterface 指令用于调用接口方法invokespecial 指令用于调用一些需要特殊处理的实例方法invokestatic 指令用于调用类方法(static方法)invokedynamic 指令用于在运行时动态解析出调用点限定符所使用的方法。

方法调用指令与数据类型无关,而方法返回指令是根据返回值的类型区分的。

异常处理指令

在java虚拟机中,处理异常(catch语句)不是由字节码指令来实现的,而是采用异常表的方式。

同步指令

java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构使用管程(Monitor)来支持的。

虚拟机实现的两种方式

方式一

将输入的Java虚拟机代码在加载或执行时翻译成另外一种虚拟机的指令集。

方式二

将输入的Java虚拟机代码在加载或执行时翻译成宿主主机CPU的本地指令集。(即JIT代码生成技术)

Class文件结构的发展

Class文件结构已经有十多年历史了,这10多年间,java技术体系有了翻天覆地的变化,但是Class文件结构一直处于比较稳定的状态,Class文件的主体结构、字节码指令的语义和数量几乎没有出现过变动, 所有Class文件格式的改进,都集中在向访问标志、属性表这些在设计上就可扩展的数据结构中添加内容。

--结束END--

本文标题: Java虚拟机,类文件结构深度解析

本文链接: https://www.lsjlt.com/news/230820.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java虚拟机,类文件结构深度解析
    Java类文件结构Java虚拟机不和包括Java在内的任何语言绑定,只与 "Class文件" 这种特定的二进制文件所关联, Class文件中包含了Java虚拟机指令集合符号表以及若干其它辅助信息。 Java虚拟机作为一个...
    99+
    2023-06-02
  • 深入理解Java虚拟机 JVM 内存结构
    目录前言JVM是什么JVM内存结构概览运行时数据区程序计数器Java虚拟机栈本地方法栈方法区运行时常量池Java堆直接内存前言 JVM是Java中比较难理解和掌握的一部分,也是面试中...
    99+
    2024-04-02
  • Java虚拟机JVM类加载机制(从类文件到虚拟机)
    目录一、类加载机制简介二、类加载机制过程 2.1、加载(Load)2.2、连接(Linking)2.3、初始化(Initialize)三、类加载器Classloader&n...
    99+
    2024-04-02
  • python虚拟机pyc文件结构是什么
    本篇内容介绍了“python虚拟机pyc文件结构是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PYC 文件pyc 文件是 Python...
    99+
    2023-07-05
  • 如何解析Java虚拟机的Class文件
    这篇文章给大家介绍如何解析Java虚拟机的Class文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前面发了几篇学习笔记,但是看这些东西总是感觉很"玄乎",来一篇实战的东西来揭一下"JV...
    99+
    2023-06-17
  • Java 8 - Optional类深度解析
    对Java 8 Optional类进行深度解析。 @pdaiJava 8 - Optional类深度解析Optional类包含的方法ofofNullableisPresentgetifPresentorElseorElseGetorElse...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • 深度分析java dump文件
    目录JVM dump获取JVM dump文件dump文件分析结构详解文件头java一个类的成员变量有两种类型内容块块头gc root类对象基本信息说明实例对象基本类型数组基本信息说明...
    99+
    2024-04-02
  • 怎样深度解析Lustre体系结构
    这期内容当中小编将会给大家带来有关怎样深度解析Lustre体系结构,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  Lustre架构是一种集群存储体系结构,其核心组件就是Lustre文件系统。该文件系统可...
    99+
    2023-06-04
  • java虚拟机中栈结构是怎样的
    这篇文章将为大家详细讲解有关java虚拟机中栈结构是怎样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对...
    99+
    2023-06-14
  • 怎么剖析JVM虚拟机的内部结构
    怎么剖析JVM虚拟机的内部结构,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JVM虚拟机的内部结构JVM虚拟机是Java平台的核心, 为了让编译产生的字节码能够...
    99+
    2023-06-17
  • Java虚拟机的内存结构是怎样的
    本篇内容主要讲解“Java虚拟机的内存结构是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java虚拟机的内存结构是怎样的”吧!一:简介内存(Memory)也被称为内存储器,其作用是用于暂...
    99+
    2023-06-02
  • 和解析Java虚拟机概念及数据类型
    今天就跟大家聊聊有关和解析Java虚拟机概念及数据类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。你对Java虚拟机的概念是否熟悉,这里向大家描述一下,Java虚拟机是一个想象中的...
    99+
    2023-06-17
  • 阿里云数据库的结构深度解析
    阿里云数据库是阿里巴巴集团提供的一种数据库服务。它采用了云计算技术,为用户提供强大的数据库处理能力。本文将详细解析阿里云数据库的结构。 一、什么是阿里云数据库阿里云数据库是阿里云提供的一种云数据库服务,它基于云计算技术,提供了高性能、高可用...
    99+
    2023-12-18
    阿里 深度 结构
  • Java 虚拟机栈详解分析
    Java虚拟机栈 1. 定义 栈:线程运行时需要的内存空间,一个栈存在多个栈帧。栈具有先入后出,后入先出的特点。 栈帧:每个方法运行时需要的内存(局部变量表、操作数...
    99+
    2024-04-02
  • 如何深入理解Java虚拟机JVM类加载初始化
    如何深入理解Java虚拟机JVM类加载初始化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 Classloader的作用,概括来说就是将编译后的class装载、...
    99+
    2023-06-17
  • 如何理解Java虚拟机及JVM体系结构是什么
    今天就跟大家聊聊有关如何理解Java虚拟机及JVM体系结构是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JVM(Java 虚拟机)Java虚拟机,java源文件(.java)通...
    99+
    2023-06-17
  • 深入浅析java虚拟机中的对象访问
    今天就跟大家聊聊有关深入浅析java虚拟机中的对象访问,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。java 虚拟机中对象访问详解对象访问会涉及到Java栈、Java堆、方法区这三个...
    99+
    2023-05-31
    java 虚拟机 对象访问
  • Java虚拟机中JVM内存结构是怎么样的
    这篇文章给大家分享的是有关Java虚拟机中JVM内存结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、JVM启动流程:JVM启动时,是由java命令/javaw命令来启动的。二、JVM基本结构:JV...
    99+
    2023-06-02
  • Java虚拟机内存结构及编码实战分享
    目录了解JVM内存结构的目的JVM内存结构简介程序计数器虚拟机栈本地方法栈堆方法区总结了解JVM内存结构的目的 在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C、...
    99+
    2024-04-02
  • Java虚拟机之类加载的示例分析
    小编给大家分享一下Java虚拟机之类加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作