第六章 类文件结构
 
6.2 无关性的基石
各种不同平台的虚拟机与所有的平台都统一使用的程序存储格式--字节码(ByteCode)是构成平台无关性的基石。java虚拟机不和包括java在内的任何语言绑定,它只与“Class”文件这种特定的二进制文件格式所关联,Class文件包含了java虚拟机指令集和符号表以及若干其他辅助信息。虚拟机并不关心Class的来源是何种语言。
 
6.3 Class类文件的结构
Class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加的任何分割符。 Class文件格式采用类似于C语言结构体的伪结构体来存储数据,这种伪结构中只有两种数据类型:无符号数和表。
无符号数属于基本的数据类型,以u1、u2、u3、u4、u8分别代表1个字节、2个字节、3个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值、或者按照UTF-8编码构成字符串值。
表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表习惯以“_info”结尾。
无论是无符号数还是表,当需要描述同一个类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干个连续的数据项的形式。
 
6.3.1魔数与Class文件的版本
每个Class文件的头4个字节称为魔数(magic number),它的唯一作用是确认这个文件是否为一个能够被虚拟机接受的Class文件,Class文件的魔数值为:0XCAFEBABY。紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节时次版本号(Minor Version),第7和第8个字节是主版本号(Major Version)。高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即时文件格式并未发生任何变化,虚拟机也必须拒绝执行超过其版本号的Class文件。
 
6.3.2常量池
紧接着主次版本号之后的时常量池入口,常量池可以理解为Class文件之中的资源仓库。常量池中常量数目不固定,所以入口处放置一个u2类型的数据代表常量池容量计数值(此值从1开始)。常量池中主要用于存放两大类常量:字面量(Literal)和符号引用(Sysmbolic References)。字面量比较接近java语言层面的常量概念,如文本字符串、声明为final的常量的值等。而符号引用则属于编译原理方面的概念,包含以下三类常量:
  1. 类和接口的全限定名
  2. 字段的名称和描述符
  3. 方法的名称和描述符
java代码在进行javac编译的时候,在虚拟机加载Class文件的时候进行动态连接。当虚拟机运行时,需要从常量池中获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址中。
 
6.3.3 访问标志
常量池结束后,紧接着两个字节代表访问标志,用于标识一些类或者接口层次的访问信息,包括Class是类还是接口;是否为public类型;是否定位为abstract类型等。
 
6.3.4 类索引、父类索引、接口索引集合
前两者是一个u2类型的数据,最后一个是u2类型的数据的集合。Class文件中由这三项数据来确定这个类的继承关系。索引指向的值可以在常量池中找到。
 
6.3.5字段表集合
字段表用于描述接口或者类中声明的变量。字段包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。字段表不会列出从超类或者父接口中继承而来的字段,但有可能列出原本java代码中不存在的字段,比如内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的变量。
 
6.3.6方法表集合
和字段表集合结构类似。但是方法中的java代码。经过编译期编译成字节码指令后,存放在方法属性表结合中一个名为“Code”的属性里面。如果父类方法在子类中没有被重写,方法表集合中不会出现来自父类的方法信息。
 
6.3.7 属性表集合
在Class文件、字段表、方法表都可以携带自己的属性表集合,用于描述某些场景专有的信息。
 
 
6.4 字节码指令简介
java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需要的参数(称为操作数,Operands)而构成,由于java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数指令都不包含操作数,只有一个操作码。
 
6.4.10 同步指令
java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor)来支持的。
方法级的同步时隐式的,无需通过字节码指令来控制,通过竞争获取管程实现。同步一段指令集序列通常由java synchronized语句块来表示的,java虚拟机指令集中有monitorenter和monitorexit两条指令来支持synchonized关键字的语义。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

《深入理解java虚拟机》第六章 类文件结构的更多相关文章

  1. 深入理解java虚拟机-第六章

    第6章 类文件 6.3 Class类文件的结构 Class文件是一组以8位字节为基础单位的二进制流. Class文件格式采用一种类似C语言结构伪结构存储数据,这种伪结构中只有两种数据类型:无符号数和表 ...

  2. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  3. 深入理解java虚拟机-第13章-线程安全与锁优化

    第十三章 线程安全与锁优化 线程安全 java语言中的线程安全 1 不可变.Immutable 的对象一定是线程安全的 2 绝对线程安全 一个类要达到不管运行时环境如何,调用者都不需要额外的同步措施, ...

  4. 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域  

  5. 深入理解java虚拟机_第二章_读书笔记

    1.本章内容目录: 概述 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 ...

  6. 深入理解Java虚拟机-第1章-走进Java-读书笔记

    第 1 章 走近 Java 前言 Java 的技术体系主要是由支撑 Java 程序运行的虚拟机.为各开发领域提供接口支持的 Java API.Java 编程语言及许许多多的第三方 Java 框架(如 ...

  7. 深入理解java虚拟机(六)字节码指令简介

    Java虚拟机指令是由(占用一个字节长度.代表某种特定操作含义的数字)操作码Opcode,以及跟随在其后的零至多个代表此操作所需参数的称为操作数 Operands 构成的.由于Java虚拟机是面向操作 ...

  8. 深入了解Java虚拟机(3)类文件结构

    虚拟机执行子系统 一.类文件结构 1.魔数和class版本 1.magic-魔数:0xCAFEBABE:4字节 2.minor_version:次版本,丶之后的数字:2字节 3.major_versi ...

  9. 深入理解java虚拟机(3)---类的结构

    计算机在开始的时候,只认识0和1,所以汇编语言是和机器结构或者说CPU绑定的.ARM体系结构就是这样一种体现,指令集的概念. 随着高级语言的出现,从字编码发展到了字节编码,计算机的先驱希望能够让语言能 ...

随机推荐

  1. git 快捷键

    实际上就是弄了个别名 $ git config --global alias.st status $ git config --global alias.ci commit $ git config ...

  2. Java之使用HttpClient发送GET请求

    package LoadRunner; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import o ...

  3. [IOI2018]会议——分治+线段树

    题目链接: [IOI2018]meetings 题目大意:有$n$座山峰,每座山峰有一个高度,有$q$次询问,每次需要确定一个开会山峰使$[l,r]$所有山峰上的人都前往开会山峰,一个山峰的人去开会的 ...

  4. 自学Linux Shell5.1-shell父子关系

    点击返回 自学Linux命令行与Shell脚本之路 5.1-shell父子关系 1 shell常见的种类  bash是Linux标准默认的Shell,是BunrneAgain Shell的缩写,内部命 ...

  5. [HAOI2015]按位或(min-max容斥,FWT,FMT)

    题目链接:洛谷 题目大意:给定正整数 $n$.一开始有一个数字 $0$,然后每一秒,都有 $p_i$ 的概率获得 $i$ 这个数 $(0\le i< 2^n)$.一秒恰好会获得一个数.每获得一个 ...

  6. P1099 树网的核

    NOIP 2007 提高第四题. 啊......我还是看了题解才做出来的. 这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊! 然后,这破题怎么暴力?感觉我的 ...

  7. A1010. Radix

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  8. table默认的box-sizing在不同浏览器不同

    转载自:https://blog.csdn.net/csm0912/article/details/88290672

  9. Linux替换指定列的字符串(awk 命令)

    假设有文件test.txt,想把test.txt文件第三列含有的good替换为bye,并把替换后的文件保存为test_bye.txt,只需要如下命令. test.txt go go good go m ...

  10. 2018.9青岛网络预选赛(K)

    传送门:Problem K https://www.cnblogs.com/violet-acmer/p/9664805.html 题意: 给你n个数,找出满足条件的最多的数的个数. 题解: 满足条件 ...