JVM14_Class文件结构细节、魔数、Class文件版本、常量池、访问标识(或标志)、类索引|父类索引|接口索引集合、字段|方法|属性表集合(二)

简介: ③. 如何确保高版本的JVM可执行低版本的class文件?④. 常量池(class文件的基石)①. 什么是常量池?②. 常量池计数器③. 常量池表

③. 如何确保高版本的JVM可执行低版本的class文件?


①. 不同版本的Java编译器编译的Class文件对应的版本是不一样的。目前,高版本的Java虚拟机可以执行由低版本编译器生成的Class文件,但是低版本的Java虚拟机不能执行由高版本编译器生成的Class文件。否则JVM会抛出java.lang.UnsupportedClassVersionError异常(向下兼容)


②. class文件版本号:紧接着魔数的 4 个字节存储的是 Class 文件的版本号。同样也是4个字节。第5个和第6个字节所代表的含义就是编译的副版本号minor_version,而第7个和第8个字节就是编译的主版本major_version


③. 它们共同构成了class文件的格式版本号。譬如某个 Class 文件的主版本号为 M,副版本号为 m,那么这个Class 文件的格式版本号就确定为 M.m


④. 版本号和Java编译器的对应关系如下表:


Java 的版本号是从45开始的,JDK 1.1之后的每个JDK大版本发布主版本号向上加1。


微信图片_20220107132409.png


④. 常量池(class文件的基石)


①. 什么是常量池?


①. 常量池:可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型(后面的很多数据类型都会指向此处),也是占用Class文件空间最大的数据项目之一


②. 常量池表项中,用于存放编译时期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放


微信图片_20220107132439.png


②. 常量池计数器


①. 由于常量池的数量不固定,时长时短,所以需要放置两个字节来表示常量池容量计数值。


②. 常量池容量计数值(u2类型):从1开始,表示常量池中有多少项常量。即constant_pool_ count=1表示常量池中有0个常量项


③. Demo的值为:其值为0x0016,掐指一算,也就是22。需要注意的是,这实际上只有21项常量。索引为范围是1-21。为什么呢?


(通常我们写代码时都是从0开始的,但是这里的常量池却是从1开始,因为它把第0项常量空出来了。这是为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义,这种情况可用索引值0来表示)


微信图片_20220107132500.png


③. 常量池表


  • ①. constant_pool是一种表结构,以 1 ~ constant_pool_count - 1为索引。表明了后面有多少个常量项。


  • ②. 常量池主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)


微信图片_20220107132526.png


③. 它包含了class文件结构及其子结构中引用的所有字符串常量、类或接口名、字段名和其他常量。常量池中的每一项都具备相同的特征。第1个字节作为类型标记,用于确定该项的格式,这个字节称为tag byte (标记字节、标签字节)


微信图片_20220107132544.png


相关文章
|
2天前
|
存储 XML 监控
JVM工作原理与实战(三):字节码文件的组成
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了字节码文件的基础信息、常量池、方法、字段、属性等内容。
|
1月前
|
存储 Java C++
JVM内存模型和结构详解(五大模型图解)
JVM内存模型和结构详解(五大模型图解)
|
2月前
|
存储 Java
JVM整体结构解析
JVM整体结构解析
|
2月前
|
存储 Java 编译器
深入理解JVM - 类文件结构
深入理解JVM - 类文件结构
57 1
|
3月前
|
存储 Java 编译器
JVM 组成结构
JVM包含两个子系统和两个组件:两个子系统为Class Loader(类加载器)和Execution engine(执行引擎);两个组件为Runtime data area(运行时数据 区)、Native Interface(本地接口)。
|
4月前
|
存储 缓存 前端开发
JVM(二):Class加载机制
JVM(二):Class加载机制
|
4月前
|
存储 Java 编译器
JVM(一):Class文件格式
JVM(一):Class文件格式
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
37 2
|
1月前
|
存储 算法 安全
【JVM】深入理解JVM对象内存分配方式
【JVM】深入理解JVM对象内存分配方式
26 0
|
1月前
|
Java 程序员
探讨JVM垃圾回收机制与内存泄漏
探讨JVM垃圾回收机制与内存泄漏