JAVA-JVM 之Class字节码文件的组成 【上篇】

这篇具有很好参考价值的文章主要介绍了JAVA-JVM 之Class字节码文件的组成 【上篇】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JAVA-JVM 之Class字节码文件的组成 【上篇】,JVM专题,jvm,class,字节码,java,源码文章来源地址https://www.toymoban.com/news/detail-739270.html

主页传送门:📀 传送

前言


  java的特点是跨平台性,而跨平台的运行标准是Class字节码文件,Class字节码是提供平台无关性的基础模型,使我们无须考虑如何兼容异构系统,只须被JVM识别即可。

概述


  字节码是Java虚拟机中的核心,是Java源代码的一种中间表示形式。简单来说,字节码就是将Java源代码转换为二进制格式后的中间代码。JVM通过将Java源代码编译成字节码,再通过字节码解释器将其转换为可以在不同平台上运行的本地机器码,从而实现Java跨平台的能力。

  字节码是一种中间代码,其本身并不直接被执行,而是需要经过JVM的解释或编译才能成为可执行的本地机器码。JVM在执行字节码时,会根据不同的阶段进行处理:在编译阶段,将字节码编译成本地机器码;在运行阶段,直接执行编译后的本地机器码。

  Class文件是一组以8位字节为基础单位的二进制字节流,所有16位、32位和64位长度的数据将被构造成2个、4个和8个字节单位来描述。

基本结构


  Class文件采用类似于C语言结构体伪结构来存储数据,只有两种数据类型

  • 无符号数

    • 基本数据类型,以u1,u2,u4,u8来分别表示一个字节,两个字节,四个字节和8个字节
    • 复合结构。由多个无符号数或者其他表作为数据项构成的类型,每个表都以"_info"结尾

    • 主要用于描述有层次关系的复合结构数据,整个Class文件本质上可以看成一张表

总体结构如下图所示:

JAVA-JVM 之Class字节码文件的组成 【上篇】,JVM专题,jvm,class,字节码,java,源码

注意:
上图Class文件中的数据项,无论顺序是数量,甚至于数据存储的字节序这样的细节,都是被严格限定的。哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变

魔数头


  Class文件的1-4个字节代表该文件的魔数头。(用于标记该文件格式)Class文件格式的魔数值固定为“0xCAFEBABE” 无法修改

  唯一功能: 判断该文件格式是否为一种能被虚拟机接受的Class文件。(基于安全方面的考虑,在做软件的文件上传功能的时候,一定是要读取内容判断魔数而不是判断后缀名。)

版本号


  魔数头后的4个字节存储的就是Class文件的版本号(包括副版本号minor_version和主版本号major_version),其中5,6个字节表示Class文件的副版本号。7,8个字节表示Class文件的主版本号。主版本号和副版本号共同确定类文件格式的版本。

  JVM实例只提供特定范围的主版本号(Mo-Mn)和0至特定范围内(0至m)的副版本号。
版本对于关系如下表:

JDK版本 副版本号 主版本号 十进制
JDK1.2 0000 002E 46
JDK1.3 0000 002F 47
JDK1.4 0000 0030 48
JDK1.5 0000 0031 49
JDK1.6 0000 0032 50
JDK1.7 0000 0033 51
JDK1.8 0000 0034 52

常量池


版本号之后是常量池相关的数据项,主要包含俩部分:

  • 常量池索引计数器
    • u2的无符号数,主要用于记录常量池中相关元素数量,值只在大于0且小于constant_pool_count时才有效。
  • 常量池元数据
    • 字面量

      • 文本字符串
      • 声明为final的常量值
      • 等….
    • 符号引用

      • 类和结构的全限定名(类元数据,接口元数据)
      • 字段的名称和描述符(字段元数据,字段符号引用)
      • 方法的名称和描述符(方法元数据,方法符号引用)
      • 属性元数据
      • 对常量池中数据项的引用,此外常量池中各个项也会互相引用
      • 字节码指令中也存在对常量池的引用。

JAVA-JVM 之Class字节码文件的组成 【上篇】,JVM专题,jvm,class,字节码,java,源码

再来看CONSTANT_Class_info ,结构如下图:

JAVA-JVM 之Class字节码文件的组成 【上篇】,JVM专题,jvm,class,字节码,java,源码
由于已经确定了数据的表结构,所以他并没有tag,所以0x0004就表示后面的index,即指向全限定名的常量项目的索引,而他指向第四个常量

访问标志


  紧接着常量池后面的两个字节(u2类型)就表示访问标志位,它是种掩码标志,用于表示某个类或者接口的访问信息及基础属性。具体含义如下图:

JAVA-JVM 之Class字节码文件的组成 【上篇】,JVM专题,jvm,class,字节码,java,源码

JAVA-JVM 之Class字节码文件的组成 【上篇】,JVM专题,jvm,class,字节码,java,源码

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

到了这里,关于JAVA-JVM 之Class字节码文件的组成 【上篇】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM(字节码文件详解)

    类加载器 运行时数据区域 执行引擎(主要理解垃圾回收器,及时编译器) 本地方法 在讲解字节码文件组成前,可以安装使用“ jclasslib ”工具或idea中“ jclasslib ”插件进行字节码文件查看 jclasslib的Github地址: https://github.com/ingokegel/jclasslib

    2024年01月23日
    浏览(63)
  • 【JVM学习】Class文件解析

    最近为了加深对于JAVA的理解,在复习JVM,这里面的内容大部分都是比较确定的、文档性质的内容,目前并没有特别的总结。但是看到类文件结构,手痒,想写了个解析文件的解析器,那就简单记录下吧。 详细内容不记了,太多了,有兴趣的同学看虚拟机相关书籍了解,这里

    2023年04月13日
    浏览(85)
  • JVM系列-2.字节码文件详解

    👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家 📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 🍂博主正在努力完成2023计划中:源码

    2024年01月22日
    浏览(38)
  • 从执行class文件开始认识JVM

    编写好的java文件经过javac编译成class文件,使用java命令执行对应得我class文件,这时候jvm开始运行 首先,jvm需要将class文件装载进入内存空间(类加载机制) 在内存中分配空间(认识JVM运行时数据区) 类加载机制 类加载分为几个步骤 装载 class文件装载进JVM首先要进行的就是

    2024年02月10日
    浏览(39)
  • JVM——类加载与字节码技术—类文件结构

      由源文件被编译成字节码文件,然后经过类加载器进行类加载,了解类加载的各个阶段,了解有哪些类加载器,加载到虚拟机中执行字节码指令,执行时使用解释器进行解释执行,解释时对热点代码进行运行期的编译处理。    根据下面规范,魔数,两个版本,常量池信息

    2024年02月11日
    浏览(38)
  • JAVA工程师面试专题-JVM篇

    目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用? 2、说一下 JVM 运行时数据区 ? 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方? 5、类常量池、运行时常量池、字符串常量池有什么区别? 6、JVM为什么使用元空间替换永久代 二、垃

    2024年02月21日
    浏览(45)
  • 什么时候会触发FullGC?描述一下JVM加载class文件的原理机制?

    什么时候会触发 FullGC? 除直接调用 System.gc 外,触发 Full GC 执行的情况有如下四种。 1. 旧生代空间不足 旧生代空间只有 在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行 Full GC 后空间仍然不 足,则抛出如下错误: java.lang.OutOfMemoryError: Java heap spac

    2024年02月20日
    浏览(44)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(89)
  • 深入理解JVM虚拟机第二十七篇:详解JVM当中InvokeDynamic字节码指令,Java是动态类型语言么?

     😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨ 2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群: 583783824   📚📚  工作微信: BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月04日
    浏览(44)
  • Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    1.java运行时的内存分配,创建对象时内存分配; 2.类加载的顺序,创建一个唯一的类的类对象; 3.创建对象的方式,new,Class.forName,clone; 4.什么时候加载.class文件进入JVM内存中,看到new,Class.forName; 5.如何加载?双亲委托(委派)机制:安全;AppClassLoader; 6.反射实质:能

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包