Arnold's Blog Arnold's Blog
🏠首页
  • Java
  • Python
💻前端
🕸️周边技术
🗒️札记
  • Tips
  • 读书
  • 友情链接
🧑‍💻关于
🔖收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Arnold Shu

知人者智,自知者明。胜人者有力,自胜者强。
🏠首页
  • Java
  • Python
💻前端
🕸️周边技术
🗒️札记
  • Tips
  • 读书
  • 友情链接
🧑‍💻关于
🔖收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java

    • Java注解以及自定义注解
    • 函数式编程(JAVA)
    • 记一次GC 排查及优化
    • JVM浅析总结(JVM的生命周期)
    • JVM浅析总结(类加载器)
    • JVM浅析总结(运行时数据区)
    • JVM浅析总结(执行引擎)
    • JVM浅析总结(垃圾回收)
    • JVM浅析总结(Class文件结构)
      • Class文件结构
        • class类的本质
        • class文件格式
    • JVM浅析总结(JAVA监控与调优工具)
    • 程序设计中SPI和API
  • Python

  • Spring

  • SpringBoot

  • backend
  • Java
Arnold Shu
2021-11-18
目录

JVM浅析总结(Class文件结构)

# Class文件结构

java规范(语言规范和虚拟机规范)官方网站:https://docs.oracle.com/javase/specs/index.html (opens new window)

# class类的本质

任何一个Class 文件对应这唯一一个类或者接口的定义信息,class文件是一组以8位字节为基础单位的二进制流

# class文件格式

采用一种类似于C语言结构体的方式进行数据存储,数据中有两种数据类型:无符号数和表

类型 具体含义
无符号数 属于基本数据类型,以u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节的无符号数,无符号数可以用来描述数字,索引引用,数量值或者UTF-8编码构成字符串值
表 由多个无符号数或者其他作为数据项构成的复合数据类型,所有表都习惯性的以_info结尾,表用于描述有层次关系的复合结构的数据,整个Class文件本质就是一张表,由于表没有固定长度,所以通常会在其前面加上个数说明

class文件基本结构(官方文档地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html (opens new window))

ClassFile {
    u4             magic;     #魔数                           
    u2             minor_version;   #class文件次要版本号
    u2             major_version;   #class文件主要要版本号
    u2             constant_pool_count;   #常量池内部项目数量=constant_pool table +1
    cp_info        constant_pool[constant_pool_count-1]; #常量池结构表
    u2             access_flags;   #访问标识
    u2             this_class;  #当前类说明
    u2             super_class;  #父类说明
    u2             interfaces_count;  #接口数量
    u2             interfaces[interfaces_count]; #接口数组
    u2             fields_count;   #字段数量
    field_info     fields[fields_count];  #字段数组
    u2             methods_count;   #方法数量
    method_info    methods[methods_count];   #接口数组
    u2             attributes_count;   #属性个数
    attribute_info attributes[attributes_count];   #属性数组
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
类型 名称 说明 长度 数量
u4 magic 魔数,识别class文件格式 四个字节 1
u2 minor_version class次版本号 两个字节 1
u2 major_version class主版本号 两个字节 1
u2 constant_pool_count 常量池计数器 两个字节 1
cp_info constant_pool 常量池表,存放编译生成的字面量和符号引用,通过类加载之后进入方法区的运行时常量池 n个字节 constant_pool_count-1
u2 access_flags 访问标识 两个字节 1
u2 this_class 类索引 两个字节 1
u2 super_class 父类索引 两个字节 1
u2 interfaces_count 接口计数器 两个字节 1
u2 interfaces[interfaces_count] 接口索引集合 两个字节 1
u2 fields_count 字段计数器 两个字节 1
field_info fields[fields_count] 字段表 N个字节 fields_count
u2 methods_count 方法计数器 两个字节 1
method_info methods[methods_count] 方法表 N个字节 methods_count
u2 attributes_count 属性计数器 两个字节 1
attribute_info attributes[attributes_count] 属性表 N个字节 attributes_count
#JVM#GC
上次更新: 2023/12/18, 13:54:07
JVM浅析总结(垃圾回收)
JVM浅析总结(JAVA监控与调优工具)

← JVM浅析总结(垃圾回收) JVM浅析总结(JAVA监控与调优工具)→

最近更新
01
《领域驱动设计:软件核心复杂性应对之道》书摘
12-26
02
Linux 的常用命令
10-22
03
程序设计中SPI和API
10-22
更多文章>
Theme by Vdoing | Copyright © 2017-2024 Arnold Shu | CC BY-SA 4.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式