首页 > 其他分享 >JVM学习笔记(二)

JVM学习笔记(二)

时间:2023-09-14 14:07:46浏览次数:43  
标签:文件 常量 笔记 学习 索引 接口 JVM Class 字节


接上文

------------------------------------

二、类文件结构

虚拟机不关注Class的来源是什么语言,它只要符合Class文件应有的结构就可以在Java虚拟机中运行。

1.Class类文件结构

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

Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有2种数据类型:无符号数和表。

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

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

Class文件格式:

u4   magic   数量1

u2   minor_version   数量1

u2   major_version   数量1

u2   constant_pool_count   数量1

cp_info    constant_pool    数量constant_pool_count-1

u2   access_flags   数量1

u2   this_class   数量1

u2   super_class  数量1

u2   interfaces_count  数量1

u2   interfaces   数量interfaces_count  

u2   fields_count  数量1

field_info  fields  数量fields_count  

u2   methods_count  数量1

method_info  methods  数量methods_count

u2   attributes_count   数量1

attribute_info   attributes   数量attributes_count

 

(1)魔数与Class文件版本:

每个Class文件头4个字节称为魔数,唯一作用是确定这个文件是否能被虚拟机接受的Class文件。

因为使用文件扩展名可以很随意地被改动,使用魔数而不是扩展名来进行识别主要是基于安全考虑,只要这个魔数值还没有被广泛用过而引起混淆即可。

Class文件的魔数值为:0xCAFEBABE

紧接着魔数的4个字节存储的是Class文件版本号:第5和第6字节是次版本号,第7和第8字节是主版本号。

高版本JDK可以向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式并未发生变化。

JDK1.5  主版本号  49 \ JDk1.6  主版本号  50

(2)常量池constant_pool:

紧接着主次版本号的是常量池入口,常量池是Class文件结构中与其它项目关系最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时是Class文件中第一个出现的表类型数据。

由于常量池的数量不固定,所以在常量池入口需放置一项u2类型的数据,代表常量池容量计数值。这个容器计数是从1而不是从0开始的。Class文件格式规范将第0项常量空出来是有特殊考虑的,这样为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达"不引用任何一个常量池项目"的意思。

只有常量池容量计数是从1开始的,对于其他集合类型,包括接口索引集合、字段表集合、方法表集合等的容量计数都与一般习惯相同,是从0开始的。

常量池主要存放2大类常量:字面量和符号引用。

字面量:如文本字符串、被声明为final的常量值。

符号引用:类和接口全限定名、字段名称和描述符、方法名称和描述符。

虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析并翻译到具体的内存地址之中。

常量池中每一项常量都是一个表,共有11种结构各不相同的表结构数据,者11种表都有一个共同的特点。即使表开始的第一位是一个u1类型的标志位(取值为1-12,缺少标志为2的数据类型),代表当前这个常量属于哪种常量类型。

在JDK的bin目录中,有一个专门用于分析Class文件的字节码的工具javap:

javap -verbose TestClass

(3)访问标志access_flags:

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

(4)类索引、父类索引与接口索引集合:

类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合,Class文件中由这3项数据来确定这个类的继承关系。

Java不允许多重继承,所以父类索引只有一个,除了java.lang.Object之外,所有Java类都有父类,父类的索引都不为0。接口索引集合就用来描述这个类实现了哪些接口,这些被实现的接口将按implements语句后的接口顺序从左到右排列在接口的索引集合中。

类索引、父类索引和接口索引集合都按顺序排列在访问标志之后,类索引和父类索引用两个u2类型的索引值表示。对于接口索引,入口第一项为u2类型的数据为接口计数器,表示索引表的容量。如果该类没有实现任何接口,那么该计数器值为0。,后面接口的索引表不再占用任何字节。

(5)字段表集合:

字段表用于描述接口或类中声明的变量。

字段包括了类级变量或实例级变量,但不包括在方法内部声明的变量。

(6)方法表集合。

标签:文件,常量,笔记,学习,索引,接口,JVM,Class,字节
From: https://blog.51cto.com/u_6978506/7469660

相关文章

  • JVM学习笔记(一)
    前言:曾经看过一本很好的关于介绍Java虚拟机的书,好像叫《深入Java虚拟机(第二版)》的电子版,但不慎遗失了,实在可惜。有时间再到网上找找,看还有没有下载的。  一、关于运行时数据区域:1.Java虚拟机所管理的内存将包括以下的几个运行时数据区域:程序计数器、Java虚拟机栈、本地方法栈、......
  • Office学习之excel
    报了一个简知学office课程,贵了点,还是能学到不少东西的,当然如果你勤奋好学这些资料网上应该也有,我比较懒。之前也学了一部分,但是前面学后面忘,尤其是excel用的不多的情况下,很快就忘了,就想着把一些知识点记录下来知识点一:数据表格内容叠在一起,一列列的双击太费事,将鼠标放在空白处然......
  • 3-spark学习路线-Spark安装
    1.从https://spark.apache.org/获得Spark的安装包2.解压并安装Sparktar–zxvfspark-****-bin-hadoop2.7.tgz3.配置Spark在YARN平台上运行Spark需要配置HADOOP_CONF_DIR、YARN_CONF_DIR和HDFS_CONF_DIR环境变量3.1vim/etc/profile ex......
  • 2-spark学习路线-应用常景和解决
    在实际应用中,大数据处理主要包括以下三个类型:1.复杂的批量数据处理:通常时间跨度在数十分钟到数小时之间2.基于历史数据的交互式查询:通常时间跨度在数十秒到数分钟之间3.基于实时数据流的数据处理:通常时间跨度在数百毫秒到数秒之间当同时存在以上三种场景时,就......
  • 【刷题笔记】50. Pow
    题目Implement pow(x, n),whichcalculates x raisedtothepower n (xn).Example1:Input:2.00000,10Output:1024.00000Example2:Input:2.10000,3Output:9.26100Example3:Input:2.00000,-2Output:0.25000Explanation:2-2=1/22=1/4=0.25N......
  • 1-spark学习路线-spark 概述
    一.spark和hadoopMapReduceSpark数据存储结构:磁盘HDFS文件系统的split使用内存构建弹性分布式数据集RDDs对数据进行运算和cache编程范式:Map+ReduceDAG:Transformation+Action计算中间结果落到磁盘IO及序列化、反序列化代价大计算中间结果在内存中维护存取速度比磁盘高几个数......
  • 机器学习 人与马的识别
    (一)选题背景:可以帮助人们更好地管理马匹,提高马术运动和相关产业的工作效率。人与马识别涉及到图像处理、机器学习、深度学习等领域,是计算机视觉技术的经典问题之一。对该问题进行深入研究,可以促进相关领域的技术发展,为其他类似问题提供参考。总体而言,人与马识别是一个具有实际应用......
  • Cisco Nexus 9000v 虚拟机换机系统软件 NX-OS Release 10.4(1)F 发布 - 学习 Nexus 和
    CiscoNexus9000vSwitch,NX-OSRelease10.4(1)F请访问原文链接:https://sysin.org/blog/cisco-nexus-9000v/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgNX-OSSystemSoftwareReleaseDateCiscoNX-OSRelease10.4(1)F2023-08-18CiscoNX-OSRel......
  • JS深入学习笔记 - 第二章.类和对象
    3.类和对象3.1面向对象这里顺带提一句学习JAVA时,老师说的面向对象和面向过程的区别:面向过程:强调做什么事情,具体什么步骤。举个把大象放进冰箱的例子:打开冰箱门把大象放进冰箱关上冰箱门面向对象:强调的是做动作的主体(称之为对象)冰箱:打开操作冰箱:放的操作(放的可以是大象......
  • HTML学习
    HTMLHyperTextMarkupLanguage(超文本标记语言)超文本:文字、图片、音频、视频等网页查看HTML代码:右击审查元素HTML5+CSS3HTML5完全取代了flashHTML5的优势所有浏览器的支持市场的需求跨平台W3C标准WorldWideWebConsortium(万维网联盟)//可以了解一下IEEh......