深入理解JVM—类文件结构

一、概述

各种不同平台的Java虚拟机,以及所有平台都统一支持的程序存储格式——字节码(Byte Code)是构成平台无关性的基石。

JVM只认Class文件实现语言无关性的基础仍然是虚拟机和字节码存储格式JVM是跨语言的平台。Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class⽂件”这种特定的二进制⽂件格式所关联,Class⽂件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。

 

 

  • Class file Format

Class文件是JVM执行引擎的数据入口。Class文件是⼀组以8个字节为基础单位的二进制流。

Class文件格式采⽤两种数据类型:“无符号数”(u1 u2 u4 u8)和“表”(_info)。

 

constant_pool常量池

可以比喻为Class⽂件⾥的资源仓库, 它是Class文件结构中与其他项⽬关联最多的数据,通常也是占⽤Class文件空间最⼤的数据项⽬之⼀,另外,它还是在Class文件中第⼀个出现的表类型数据项⽬。

由于常量池中常量的数量是不固定的,所以在常量池的⼊⼝需要放置⼀项u2类型的数据,代表常量池容量计数值(constant_pool_count),这个容量计数是从1⽽不是0开始的。

常量池中主要存放两⼤类常量: 字⾯量(Literal)和符号引⽤(Symbolic References)

字面量比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。而符号引⽤则属于编译原理方面的概念,主要包括下⾯⼏类常量:

·被模块导出或者开放的包(Package)

·类和接口的全限定名(Fully Qualified Name)

·字段的名称和描述符(Descriptor)

·方法的名称和描述符

·方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)

·动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)

Java代码在进行javac编译的时候,并不像C和C++那样有“连接”这⼀步骤,而是在虚拟机加载Class文件的时候进行动态连接。也就是说,在Class文件中不会保存各个方法、字段最终在内存中的布局信息,这些字段、方法的符号引用不经过虚拟机在运行期转换的话是无法得到真正的内存入口地址,也就无法直接被虚拟机使用的。当虚拟机做类加载时,将会从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中

访问标志:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欣欣uvo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值