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,则查表即可得到相关信息;字段名索引字段描述符索引 都要去常量池中进行查找;字段的属性计数器表示当前字段有多少个属性。方法的描述信息与字段类似。只不过图中有两个方法。

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

相关推荐
程序员卷卷狗1 天前
JVM 调优实战:从线上问题复盘到精细化内存治理
java·开发语言·jvm
Sincerelyplz2 天前
【JDK新特性】分代ZGC到底做了哪些优化?
java·jvm·后端
初学小白...3 天前
线程同步机制及三大不安全案例
java·开发语言·jvm
凤山老林3 天前
还在用JDK8?JDK8升级JDK11:一次价值千万的升级指南
java·开发语言·jvm·spring boot·后端·jdk
2501_938790073 天前
详解 JVM 中的对象创建过程:类加载检查、内存分配、初始化的完整流程
jvm
宸津-代码粉碎机3 天前
Java内部类内存泄露深度解析:原理、场景与根治方案(附GC引用链分析)
java·开发语言·jvm·人工智能·python
杨筱毅3 天前
【底层机制】Android GC -- 为什么要有GC?GC的核心原理?理解GC的意义
android·jvm·gc
東雪木3 天前
Java基础语言进阶学习——1,JVM内存模型(堆、栈、方法区)
java·jvm·学习
小满、3 天前
JVM 执行引擎:字节码是如何被执行的
jvm·字节码·jvm执行引擎
无敌最俊朗@4 天前
SQLite 约束 (Constraints) 面试核心知识点
java·开发语言·jvm