JVM(八)-- Class文件

目录

一、前端编译器

二、Class文件结构

[1. 常量池计数器](#1. 常量池计数器)

[2. 常量池](#2. 常量池)

[3. 访问标识](#3. 访问标识)

[4. 类索引、父类索引、接口索引集合](#4. 类索引、父类索引、接口索引集合)

[5. 字段表集合](#5. 字段表集合)

6.方法表集合

7.总结


一、前端编译器

前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件。

二、Class文件结构

任何一个Class文件都对应着唯一一个类或者接口的定义信息,Class文件实际上不一定以磁盘文件的形式存在(也可以通过网络进行传输)。Class文件是一组以8个字节为基础单位的二进制流。

Class的结构不像XML等语言,由于没有任何分隔符号,所以其中的数据项都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变。

Class文件的总体结构如下:魔数、Class文件版本、常量池、访问标志、索引集合、字段表集合、方法表集合、属性表集合。

在·

1. 常量池计数器

2. 常量池

常量池可以理解为Class文件中的资源仓库,也是占用Class文件空间最大的数据项目之一。

常量池中为什么要包含这些内容?

Java代码在进行编译的时候,并不像C和C++有"连接"这一步骤,而是在虚拟机加载Class文件进行动态链接。在Class文件中不会保存方法、字段的最终内存信息,因此这些方法和字段只能保存为符号引用,在虚拟机运行时再转换为真实的内存信息。

3. 访问标识

4. 类索引、父类索引、接口索引集合

类索引是指向常量池的索引,提供了当前类的全限定名;父类索引也是指向常量池的索引,提供了父类的全限定名。

5. 字段表集合

字段表集合中包括字段计数器字段表

6.方法表集合

方法表集合与字段表集合在设计上是差不多的。包含方法计数器方法表

7.总结

对于Class文件的分析可以用下面的几张图来进行总结。

下面这张图展示了魔数 (cafe babe),这是Class文件的表示;以及主版本和副版本 ,两者结合表示当前Class文件的版本号。常量池计数器存储了该常量池中的常量个数;后面每一个常量的开头都有一个标识Tag,表明了该常量是个什么类型。

下面这张图包含了该类的访问标识等信息。当前类索引父类索引 都是指向常量池的索引,常量池中包含了当前类和父类的相关信息,根据索引才可以查询到相关信息。黄色背景指的是实现接口的计数器,因为当前类并没有实现接口,所以计数器中数值为0.

下面这张图给出了该类中字段和方法的信息。字段计数器 表示该类中有多少个字段(即类中的成员变量);字段访问标识表示 该字段的修饰符属性(即public、final等),图中字段访问标识为2,则查表即可得到相关信息;字段名索引字段描述符索引 都要去常量池中进行查找;字段的属性计数器表示当前字段有多少个属性。方法的描述信息与字段类似。只不过图中有两个方法。

对于字段和方法的属性,可以简单地理解为它们的特征信息,即它们在类中所具有的修饰符、类型、名称、作用范围、行为特征等。

相关推荐
忘记9263 分钟前
jvm性能调优
jvm
C++chaofan2 小时前
Java 并发编程:synchronized 优化原理深度解析
java·开发语言·jvm·juc·synchronized·
sww_10262 小时前
JVM基础学习
jvm·学习·测试工具
芒克芒克6 小时前
深入浅出JVM的运行时数据区
java·开发语言·jvm·面试
月明长歌6 小时前
JavaThread类详解核心属性、常用方法与实践
java·开发语言·jvm
kaico20186 小时前
JVM的垃圾回收
开发语言·jvm
zfj3216 小时前
java垃圾收集 minorgc majargc fullgc
java·开发语言·jvm·gc·垃圾收集器
烟沙九洲7 小时前
JVM 堆内存分代
java·jvm
独自破碎E8 小时前
JVM由哪些部分组成?
jvm
曹轲恒1 天前
JVM之垃圾回收算法(GC)
jvm·算法