JVM之类文件结构

13 篇文章 1 订阅

1.java是一门跨平台的语言,那么跨平台到底是怎么实现的

代码编译的结果 从本地机器码转化为字节码,是存储格式发展的一小步,确实编程语言的一大步。计算机虽然只能识别0和1,但是将编写的程序编译成二进制本地机器码已经不在是唯一的选择越来越多的程序语言选择了与操作系统和机器指令集无关,平台中立的格式作为程序编译后的存储格式。但是单有储存格式还是不够的,还要有能够运行他的虚拟机虚拟机并不和任何语言进行绑定,他只和特殊的字节码存储格式所关联
 

2.Class类文件结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排在Class文件之中,中间没有添加任何分隔符,当遇到需要占位8为字节以上空间的数据项目 时,则会按照高位在前(高位字节在地址最低位,地位字节在地址最高位)的方式分割成若干个8位字节进行存储。

Class文件格式采用一种类似于C语言结构体的伪结构来储存数据,这种伪结构中有两种存储 类型:无符号数和表

无符号数属于基本的数据类型可以用来描述数字,索引引用,数量值或者按照UTF-8编码构造字符串值

当需要描述同一类型但数量不定的数据时,经常会用到一种前置的容量计数器加若干个连续的数据项的形式,这时为某一类型的集合。

 

并不是所有的class文件都能被java虚拟机接受的,那么虚拟机是怎么识别的呢?

每个class文件的头4个字节称为魔数,他的唯一作用是确定这个文件是否为一个能被虚拟机接受的文件,紧接着魔数的4个字节储存的是Class文件的版本号,第5,6个字节是次版本号,第7,8个字节是主版本号。

3.常量池

在版本号后边就是常量池入口,常量池可以理解为class文件之中的资源仓库,是占用class文件空间最大的数据项目之一,常量池中常量是不固定的,所以需要在常量池的入口放置一个2字节的的常量池容量计数器

因为常量池的索引值的数据在特定的情况下需要表达 “不引用任何一个常量池项项目”的含义 ,这种 情况可以把索引设置为0来表示,所以常量池计数器要从1开始

常量池主要存放字面量和符号引用。                                                                                                                    

常量池主要分为静态常量池和运行时常量池;

静态常量池:存在于class文件中,即在编译的时候就就储存在静态的class文件中。

运行时常量池:当jvm加载class文件后,会将类的信息如常量池,字段,方法等数据装载机进方法区,此时常量池就转变为了运行时常量池,常用来存储字面量。

为什么要运行时常量池?

常量不止预先定义在class文件的字面量,还有运行时生成的常量,比如String.itern()会生成运行时常量池。

字面量:比较接近java底层常量的概念,比如文本字符串,声明为final的常量值等。

符号引用:属于编译原理方面的概念,包括类和方法的全限定名,字段的名称和描述符,方法的名称和描述符。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值