java虚拟机学习笔记——类文件结构与字节码指令

<天各一方> <天各一方>     2022-12-09     168

关键词:

文章目录

Java虚拟机学习笔记(二)——类文件结构

1.Class类文件结构

任何一个Class文件对应着唯一一个类或者是接口定义信息。

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

Class 文件格式一般采用一种伪结构来存储数据,这种伪结构有两种数据类型

  • 无符号数 u1、u2、u4、u8分别代表1字节、2字节、4字节、8字节的无符号数

  • 表是由多个无符号数或者其他表作为数据结构构成的复杂数据类型,表的命名习惯以“_info”结尾。整个Class文件可以视为一张表,这张表由下图所示的数据项严格构成。

1.1 魔数与版本

前四个字节是一个固定值,我们通过字节码可以看到 ca fe ba be,它用来确定此文件是否是一个能被虚拟机接受的Class文件。

使用魔数而不是扩展名来进行识别主要是因为扩展名可以被随意地修改。

接下来两个字节是次版本号(Minor Version),从JDK1.2到JDK12版本号均未使用,都为零,JDK12后,设计者重新启用次版本号。

第七和第八字节是主版本号(Major Version),对应规则如下:

可以看到,我的第七第八字节是 00 34,这是十六进制的数,我们换算成十进制为52,对应着JDK版本号为JDK8.

1.2 常量池

接下来两字节是常量池容量计数器,00 22,对应着应该有34个常量,但是,这里要注意,我们的常量池的容量计数不是从零开始的,而是从一开始的,表示着我们的常量索引是从“1~33”,实际只有33项。

我们使用javap -v 来验证一下:

可以看到,常量池这有33项。同时,使用javap -v 已经将我们Class文件中的字节码转换成我们可以看懂的命令了。

我们可以看到,常量池中主要存放两大类的常量:字面量和符号引用

1.3 其他:

访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合、属性表集合。

2.字节码指令

2.1 加载和存储指令

将一个局部变量加载到操作栈:iload、lload、fload、dload、aload

将一个数值从操作数栈存储到局部变量表中:istore、lstore、fstore、dstore、astore

将一个常量加载到操作数栈:bipush、sipush、ldc、iconst、lconst、fconst、dconst

2.2 运算指令

加法指令:iadd、ladd、fadd、dadd

减法指令:isub、lsub、fsub、dsub

乘法指令:imul、lmul、fmul、dmul

除法指令:idiv、ldiv、fdiv、ddiv

求余指令:irem、lrem、frem、drem

取反指令:ineg、lneg、fneg、dneg

位移指令:ishl、ishr、iushl、lshl、lshr、lushr

按位或指令:ior、lor

按位与指令:iand、land

按位异或指令:ixor、lxor

局部变量自增指令:iinc

比较指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp

2.3 对象创建与访问指令

创建类实例的指令:new

创建数组的指令:newarray、anewarray、multianewarray

访问类字段(static,或者称为类变量)和实例字段(实例变量)指令:getfield、putfield、getstatic、putstatic

取数组长度指令:array length

检查类实例类型的指令:instanceof、checkcast

2.4 操作数栈管理指令

将操作数栈顶的一个或两个元素出栈:pop、pop2

复制栈顶一个或两个数值并将复制值或双份复制值重新压入栈顶:dup、dup2…

将栈最顶端的两个数值互换:swap

2.5 方法调用和返回指令

invokevirtual:用于调用对象的实例方法,根据对象的实际类型进行分派。

invokespecial:用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法、父类方法。

invokeinterface:用于调用接口方法,会在运行时搜索一个实现了这个接口的方法对象,找出合适的方法进行调用。

invokestatic:调用类的静态方法。

2.6 其他

异常处理指令、同步指令、控制转移指令。

书籍
《深入了解Java虚拟机》

java类文件结构

...参考资料回到顶部一、概述  实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,只与"Class文件"这种特定的二进制文件所关联,Class文件中包含了Java虚拟机指令集合符号表以及若干... 查看详情

深入理解jvm学习笔记——-8虚拟机字节码执行引擎(代码片段)

八、虚拟机字节码执行引擎你只管努力,——剩下的交给时光。老规矩,先上图,大致了解一下:一.概述执行引擎是Java虚拟机最核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器... 查看详情

深入理解jvm学习笔记——-6类文件结构(代码片段)

...teone,runeverywhere。2.无关性的基石实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不和任何语言绑定,它只与"class文件"这种特定的二进制文件格式所关联。如下图所示:Java虚拟机提供的语言无关性3.Clas... 查看详情

深入java虚拟机之字节码执行引擎

...习完了这些以后,我们知道一个类是通过类加载器加载到虚拟机,存储到运行时数据区,而且我们也知道了我们方法体内的代码被编译成字节码保存在方法表中的code属性中,那么虚拟机又是怎么执行这些代码的,得出方法输出... 查看详情

javasecclass文件结构

这篇文章介绍java的class文件结构。深入理解Java虚拟机(类文件结构)我们所编写的每一行代码,要在机器上运行最终都需要编译成二进制的机器码CPU才能识别。但是由于虚拟机的存在,屏蔽了操作系统与CPU指令集的差异性,类... 查看详情

jvm|第2部分:虚拟机执行子系统《深入理解java虚拟机》(代码片段)

...周期)6.3类加载器6.3双亲委派模式6.4破坏双亲委派模式7.虚拟机字节码执行引擎7.1确定被调用的方法最后前言参考资料:《深入理解Java虚拟机-JVM高级特性与最佳实践》第1部 查看详情

01-jvm与java体系结构

1.JDK&JRE2.Java语言与Java虚拟机3.Java发展的重大事件4.虚拟机与Java虚拟机5.JVM的整体结构HotSpotVM是目前市面上高性能虚拟机的代表作之一。它采用[解释器]与[即时编译器]并存的架构。解释器:保证响应时间。及时对字节码文件逐... 查看详情

深入理解java虚拟机(类文件结构)

深入理解Java虚拟机(类文件结构)欢迎关注微信公众号:BaronTalk,获取更多精彩好文!之前在阅读ASM文档时,对于已编译类的结构、方法描述符、访问标志、ACC_PUBLIC、ACC_PRIVATE、各种字节码指令等等许多概念听起来都是云山雾... 查看详情

深入理解java虚拟机——字节码与数据类型

...指令不包含类型信息一、字节码与数据类型的概述在Java虚拟机的指令集合中,大多数的指令都包含了某操作所对应的数据类型信息。二、字节码指令iload指令用于从局部变量表中加载int类型的数据到操作数栈中。fload指令加... 查看详情

深入理解java虚拟机——字节码与数据类型

...指令不包含类型信息一、字节码与数据类型的概述在Java虚拟机的指令集合中,大多数的指令都包含了某操作所对应的数据类型信息。二、字节码指令iload指令用于从局部变量表中加载int类型的数据到操作数栈中。fload指令加... 查看详情

深入理解java虚拟机(类文件结构+类加载机制+字节码执行引擎)

周志明的《深入理解Java虚拟机》很好很强大,阅读起来颇有点费劲,尤其是当你跟随作者的思路一直探究下去,开始会让你弄不清方向,难免有些你说的啥子的感觉。但知识不得不学,于是天天看,反复看,就慢慢的理解了。... 查看详情

java虚拟机是如何执行字节码指令的?

1.概述转载:虚拟机是如何执行字节码指令的?执行引擎是Java虚拟机最核心的组成部分之一。「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力,区别是物理机的执行引擎是直接建立在处理... 查看详情

jvm进阶之路十二:字节码指令

...习字节码的相关指令。在前面的【JVM进阶之路】三:探究虚拟机对象里,提到了对象的初始化过程,对象初始化用的是new指令——这就是字节码指令。在【JVM进阶之路】十一:Class文件结构中已经学习了JVM字节码是JVM能直接识别... 查看详情

[java安全]动态加载字节码学习笔记(代码片段)

...直接放一下P神的定义:所有能够恢复成一个类并在JVM虚拟机里加载的字节序列,都在我们的探讨范围内。远程加载class文件建议先好好了解一下类加载器。之前我学习类加载器 查看详情

[java安全]动态加载字节码学习笔记(代码片段)

...直接放一下P神的定义:所有能够恢复成一个类并在JVM虚拟机里加载的字节序列,都在我们的探讨范围内。远程加载class文件建议先好好了解一下类加载器。之前我学习类加载器 查看详情

class类文件结构

...码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来... 查看详情

jvm——java虚拟机架构

Java虚拟机(Javavirtualmachine)实现了Java语言最重要的特征:即平台无关性。平台无关性原理:编译后的Java程序(.class文件)由JVM执行。JVM屏蔽了与具体平台相关的信息,使程序可以在多种平台上不加修改地运行。Java虚拟机在执... 查看详情

jvm第一弹(代码片段)

...够产生相应的.Class字节码文件,而字节码文件又通过Java虚拟机中的解释器,编译成特定机器上的机器码。①Java源文件——>编译器——>字节码文件②字节码文件——>JVM——>机器码每种平台的解释器是不同的,但是虚拟... 查看详情