JVM学习笔记--jdk的版本兼容是如何控制的?

在工作的时候遇到过这个问题:有一次本地项目突然跑不起来了,我就换了jdk,原来是jdk1.6版本的,我换成了1.8版本,后来我给测试发了包之后他们跑不起来了,看了错误日志之后发现是jdk版本兼容问题,当时虽然很疑惑,但是查到的信息就只说是jdk可以向下兼容,不能向高版本兼容,然后继续疑惑中,为什么我用jdk1.8运行过的包就不能在1.6运行了呢?


这个问题涉及到了class文件的结构。

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

  • 无符号数属于基本数据类型,以u1,u2,u3,u4分别代表一个字节,两个字节,三个字节,四个字节

  • 表是由多个无符号数或者其他表作为数据项构成的复合数据类型

class文件可以视为一张表,它没有任何分隔符,它的数据项的存储顺序、数量、字节序[Big-Endian]都是被严格限定的,不允许改变。

  • 1~4字节用来存储魔数【魔数的作用类似于文件的扩展名,用于确定这个文件是不是一个能被虚拟机接受的class文件,class文件的魔数是0xCAFFBABE】。

  • 5、6字节存储的次版本号

  • 7、8字节就存储着主版本号。

  • … …

在类加载的验证阶段,会对文件格式进行验证,虚拟机会验证:

  • class文件是否以魔数0xCAFEBABE开头
  • 主次版本号是否在当前java虚拟机接收的范围之内【《Java虚拟机规范》要求了即使文件格式并未发生任何变化,虚拟机也必须拒绝执行超过其版本号的class文件】
  • 常量池的常量是否有不被支持的常量类型
  • … …

终于知道为什么只是修改了jdk,打的包就无法运行的原因了!

更详细信息请看《深入理解java虚拟机》。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值