第六章 类文件结构
 
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. MySQL_基础知识

    -----基础知识 1.什么是数据库?     数据库(Database)是按照数据结构来组织.存储和管理数据的仓库   2.什么是关系型数据库.主键,外键,索引分别是什么?        关系型数据 ...

  2. 给kali linux2.0装一个中文输入法

    没有中文输入法好痛苦啊.. 毕竟做了无限网卡,虚拟机和主机可以完完全全当两台设备使用了,所以kali还是需要一个中文输入法才方便. 由于使用的是比较新的kali版本和源,现在安装fcitx已经可以直接 ...

  3. Mysql索引结构及常见索引的区别

    一.Mysql索引主要有两种结构:B+Tree索引和Hash索引 Hash索引 mysql中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引,是M ...

  4. delphi 通过事务插入数据

    orsn1.StartTransaction; try qry1.Sql.Clear; qry1.Sql.Text:=' select * from log '; qry1.Open; qry1.In ...

  5. Hbase之Java API远程访问Kerberos认证

    HbaseConnKer.java package BigData.conn; import BigData.utils.resource.ResourcesUtils; import org.apa ...

  6. C# 文件比较差异

    参考:https://www.cnblogs.com/vaevvaev/p/7115721.html 这里我就比较2个文件 使用了fc命令. 2个文件路径如下  path1,path2 static ...

  7. python 操作系统模块 -- OS

    os,语义为操作系统,模块提供了访问多个操作系统服务的功能,可以处理文件和目录这些我们日常手动需要做的操作.os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路 ...

  8. Leapin' Lizards HDU - 2732 (恶心的建图。。)

    这道题其实不难...就是建图恶心了点....emm... 题意: 多源多汇 + 拆边 青蛙跳柱子, 每根柱子都有一定的承载能力, 青蛙跳上去之后柱子的承载能力就会减一,跳到边界就能活 跳不到就over ...

  9. MT【22】一道分母为混合型的放缩

    评:指数函数增长>幂函数增长>对数函数增长.

  10. Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

    我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...