虽然这几天 很忙,但是学习是不能落下的,也不能推迟,因为如果推迟了一次,那么就会有无数次;加油,come on!

Java跨平台的基础:

各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石,也是语言无关性的基础。Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。

Class类文件结构

Class类的本质

任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,Class文件实际上它并不一定以磁盘文件的形式存在。

Class文件是一组以8位字节为基础单位的二进制流。

Class文件格式

各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。

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

无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。

表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表。

Class格式文件详解

Class的结构不像XML等描述语言,由于它没有任何分隔符号,所以在其中的数据项,无论是顺序还是数量,都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变。

按顺序包括:

  魔数与Class文件的版本:

   每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。使用魔数而不是扩展名来进行识别主要是基于安全方面的考虑,因为文件扩展名可以随意地改动。文件格式的制定者可以自由地选择魔数值,只要这个魔数值还没有被广泛采用过同时又不会引起混淆即可。紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(MinorVersion),第7和第8个字节是主版本号(Major Version)。Java的版本号是从45开始的,JDK 1.1之后的每个JDK大版本发布主版本号向上加1高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式并未发生任何变化,虚拟机也必须拒绝执行超过其版本号的Class文件。

  常量池:

    常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值(constant_pool_count)。与Java中语言习惯不一样的是,这个容量计数是从1而不是0开始的

    常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。

    字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值等。

    而符号引用则属于编译原理方面的概念,包括了下面三类常量:

    类和接口的全限定名(Fully Qualified Name)、字段的名称和描述符(Descriptor)、方法的名称和描述符

  在这里说一下Java中提供阅读字节码文件的工具: javap -verbose className.class;

  访问标志:

    用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等

  类索引,父类索引与接口索引集合:

    三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。由于Java语言不允许多重继承,所以父类索引只有一个,除了java.lang.Object之外,所有的Java类都有父类,因此除了java.lang.Object外,所有Java类的父类索引都不为0。接口索引集合就用来描述这个类实现了哪些接口,这些被实现的接口将按implements语句(如果这个类本身是一个接口,则应当是extends语句)后的接口顺序从左到右排列在接口索引集合中

  字段表集合:

    描述接口或者类中声明的变量。字段(field)包括类级变量以及实例级变量。

    而字段叫什么名字、字段被定义为什么数据类型,这些都是无法固定的,只能引用常量池中的常量来描述。

    字段表集合中不会列出从超类或者父接口中继承而来的字段,但有可能列出原本Java代码之中不存在的字段,譬如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的字段。

  属性表集合:

    存储Class文件、字段表、方法表都自己的属性表集合,以用于描述某些场景专有的信息。如方法的代码就存储在Code属性表中。  

从昨天开始就复工上班了,昨天太累了没有学习今天早上早来一个小时半,把昨天没学的补回来;本来打算把JVM的执行子系统也写成一个大章节,但是后来想想,还是拆分成几个小章节写吧,大章节,自己有时候回顾的时候都看不完,知识量有点多[捂脸]

作者:彼岸舞

时间:2020\03\31

内容关于:JVM

本文部分来源于网络,只做技术分享,一概不负任何责任

JVM学习第三天(JVM的执行子系统)之开篇Class类文件结构相关推荐

  1. JVM学习(三)JVM内存模型

    引言 本文希望以另外一种维度的思考方式来学习JVM内存模型,希望自己能从设计原理的维度考虑为什么存在?有什么价值?解决什么问题? 在学习JVM内存模型之前,先回顾下前面两章的内容点类加载器机制与类加载 ...

  2. JVM学习笔记【2】 类加载执行子系统

    1.JVM的简图 简要版 中文的详细版(宋文康老师教学图) 注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有 今天主要的是学习类加载执行子系统 2.类加载执行子系统的作用 类加载器子 ...

  3. 深入JVM 原理(三)JVM 垃圾收集

    目录 深入JVM 原理(一)Java内存模型:http://blog.csdn.net/qq_34707744/article/details/79278169 深入JVM原理(二)Java对象访问模 ...

  4. 【JVM学习笔记1】JVM与Java体系结构

    JVM与Java体系结构 一.JVM的重要性 ​ 面试,大厂必备: ​ 中高级程序员的必备:项目管理.调优的需要: ​ 极客精神:垃圾回收算法.JIT.底层原理. Java相较于C/C++自带安全检查 ...

  5. 【JVM学习-3.6】JVM运行时数据区--方法区

    文章目录 1. 栈.堆.方法区的交互关系 2. 方法区的理解 2.1 方法区在哪? 2.2 方法区的基本理解 2.3 Hotspot中方法区的演进 3. 设置方法区大小与OOM 3.1 jdk7及以前 ...

  6. 【JVM学习篇】剖析JVM类加载机制

    1. 类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM. public class Math {private static int i ...

  7. JVM学习笔记——什么是JVM?

    JVM(Java Virtual Machine,Java虚拟机) JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机, ...

  8. JVM学习笔记二:JVM参数

    所有线程共享的内存主要有两块:堆内存和方法区. 其中堆内存分为两块:新生代Young generation(Eden区.From Survivor区.To Survivor区).老年代Tenured ...

  9. 如何 方法内指令重排 进制_Java虚拟机jvm学习一:认识jvm的运行机制

    一.认识jvm JVM是Java Virtual Machine的简称.意为Java虚拟机 虚拟机是指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统 例如:VMWare ...

最新文章

  1. ajax默认超时时间多久,请问chrome浏览器的默认超时时间是多久?
  2. JavaScript文件中调用AngularJS内部方法或改变$scope变量
  3. NAT技术解决了IPv4地址短缺的问题,假设内网的地址数是m,而外网地址数n,若mn,则这种技术叫做(66),若mn,且n=1,则这种技术这叫做(67)。【答案】A C
  4. 程序员:今天你读了吗?
  5. jquery封装插件
  6. jpa vue管理系统_在JPA 2.1中使用@Convert正确完成映射枚举
  7. csu1377Putter HOJ12816
  8. hive中创建外部表分区表测试
  9. PyQt5案例汇总(完整版)
  10. 最小路径和--p64--动态规划
  11. Django中应用celery
  12. Matlab学习笔记#01
  13. Reg Organizer(电脑注册表清理大师)官方中文版V8.70 | win10注册表清理工具下载
  14. C语言根号下的书写方法
  15. 2021双非考研408上岸南京大学计算机经验帖
  16. Java对接微信公众号模板消息
  17. 【历史上的今天】12 月 12 日:英特尔创始人出生;PSP 发布;双十二购物狂欢节
  18. 程序识别验证码图片(一)
  19. android主线程报ANR的问题!
  20. Git 远程篇之查看远程仓库信息

热门文章

  1. 小数点后几位怎么称呼?
  2. QT 多线程使用moveToThread方式,无法停止的问题
  3. 网站被黑挂黑链跳转处理 网站被攻击解决方法
  4. 原生JS的HTTP请求相关知识
  5. while(1) 什么意思 while(i--)什么意思?
  6. 1.开胃菜(基础篇)
  7. Oracle日志文件中状态为INVALID(原因分析)
  8. 黑暗之光三部曲 黑暗之光三部曲小说
  9. 助理来也完成千万美元B轮融资 推出行业智能助理「吾来」丨Xtecher 融资消息
  10. There are test failures