JVM之Class文件结构

每一个class文件对应一个类或者接口,但是一个类或者接口不一定生成class文件,classloader直接生成。

  1. 8为字节为基础的二进制流,各个数据项按照严格的顺序排列在class文件中,没有任何分隔符,当遇到需要占用8位字节以上的数据项时,则会按照高位在前(或低位在前)方式分割为若干个8位字节存储。Big-Endian Little-Endian。
  2. 类似C语言结构体的微结构来存储数据,只包含无符号数和表两种结构。
    • 无符号数:u1,u2,u3,u4代表响应字节大小的无符号数,用来描述数字,索引引用,数量值(数字的值)或者按照UTF-8编码的字符串值。
    • 表:由无符号数和其它标组成的符合数据类型。class本质上就是一张表

  • 魔数和Class文件版本:
    class文件的头四个字节成为魔数(oxCAFEBABY),确定是否可以被虚拟机接受,多数文件存储标准都采用这个形式。紧接着的四个字节为版本号,5和6为此版本号(Minor Version),7和8为主版本号(Major Version),版本号从45开始,JDK1.1之后每个大版本发布,主版本号加1.
  • 常量池(大小不定):class文件的资源仓库,占用空间比较大,和其它数据项交互多,第一个出现表类型数据的数据项。

    • u2类型容量计数constant_pool_count,1开始,0项常量空出,指代不引用任何一个常量项目;
    • 数据类型:字面量(Literal)---接近常量概念,文本字符,final变量;符号引用(加载class文件是进行动态链接)---类和借口的全限定名、字段的名称和描述符、方法的名称和描述符。
    • 常量池中每一个常量都是一个表,u1标志位标识属于哪种数据类型。11 + 3.
  • 访问标志(2字节):
  • 类索引、父类索引与接口索引集合:
    • 类索引(this_class):u2数据类型,确定类的全限定名,
    • 父类索引(super_class):u2数据类型,确定父类全限定名,只有一个(单继承),除了Object,其它都有父类,父类索引不为0,
    • 接口索引(interfaces):u2类型数据集合,实现的接口,按照implements后的顺序排列在接口索引集合中,第一项u2为接口计数器(interfaces_count)标识索引表容量,没有则为0
  • 字段表(field_info)集合:类或者接口生命的变量,包括类级及接口级变量,不包含局部变量。
    • name_index(常量池引用):字段简单名称(没有类型和参数修饰符的方法或者字段名称, 对比权限定名--com/xxx/xxx;)descriptor_index(常量池引用):字段描述符,字段数据类型,方法参数列表(数量、类型、顺序)和返回值(保持先后顺序)。
    •  

  • 方法表集合:...
时间: 2024-10-13 00:06:08

JVM之Class文件结构的相关文章

JVM 之 Class文件结构

JVM 之 Class文件结构 本文写作目的: 1)为了加深自己学习的理解,2)帮助正在学习研究JVM的同仁,3)与任何热爱技术的达人交流经验,提升自己 以此为本,文章会尽量写的简洁,尽量保证理解的正确性,如有任何理解不到位或错误的地方,希望朋友们及时指出,严厉拍砖. 开始之前我们需要先了解一些基本的概念,这些概念是学习整个JVM原理的基础. 1)JVM虚拟机规范主要规范了Class文件结构,虚拟机内存结构,虚拟机加载,解析,执行Class文件的行为方式,以及一系列的字节码指令集. 2)Clas

深入理解JVM(七)——Class文件结构

什么是JVM的"无关性"? Java具有平台无关性,也就是任何操作系统都能运行Java代码.之所以能实现这一点,是因为Java运行在虚拟机之上,不同的操作系统都拥有各自的Java虚拟机,因此Java能实现"一次编写,处处运行". 而JVM不仅具有平台无关性,还具有语言无关性. 平台无关性是指不同操作系统都有各自的JVM,而语言无关性是指Java虚拟机能运行除Java以外的代码! 这听起来非常惊人,但JVM对能运行的语言是有严格要求的.首先来了解下Java代码的运行过

JVM初探之类文件结构

java 的 .class 文件字节码如图:Class 文件是一组以8字节为基础单位的二进制流,各个数据项目有着严格的结构.下面我们介绍下class文件的结构. 魔数 class文件的头4个字节是魔数:  ,他的作用便是验证这个文件是否是一个java虚拟机可以使用的文件, 版本号 接下来的是两个字节的小版本号,和两个字节的大版本号:  . 常量池结构 它分为两个部分: 第一部分是:常量池的容量:  即二进制 54 ,代表了 53 项常量,注意这里的容量计数是从 1 开始的即索引范围是 1 ~ 5

JVM小结--类文件结构

字节码是构成Java平台无关性的基石.实现语言无关性的基础是虚拟机和字节码存储格式. Java语言中的各种变量.关键字和运算符的语义最终是由多条字节码命令组成,因此字节码命令所能提供的语义描述能力肯定会比Java语言本身更强大. Class类文件的结构 Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有添加任何分隔符,所以整个Class文件中存储的内容基本上程序运行中必要的数据. 当遇到需要占用8位字节以上空间的数据项时,则会按照高

【JVM】虚拟机类加载机制

什么是类加载 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. <[JVM]类文件结构>讲的是Class文件结构,即我们编写的Java代码(.java文件)经过编译后生成Class文件(.class文件).这一章讲述的是如何将这个Class文件加载到内存并最终形成虚拟机直接使用Java类型的过程. 1.类加载的时机 类的生命周期 类的生命周期 其中,加载.验证.准备.初始化和卸载这5个顺序

Java Class文件详解

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) Java Class文件中包含以下信息: [+]view code ClassFile { u4 magic;                                                                               //模数u2 minor_version;                                                   

OSChina 技术周刊第十四期 —— 每周技术精粹

每周技术抢先看,总有你想要的! 移动开发 [软件]医疗和生物医学移动应用框架 mHealhDroid [博客]Android Studio 使用NDK开发 [博客]Android 4.4(KK)中利用APP打开关闭数据流量 前端开发 [软件]HTML5 演示文档制作框架 polySlides [资讯]30 个最棒的 jQuery 的拖放插件 服务端开发/管理 [软件]反向HTTP代理/负载均衡器和SSL封装器 Pound [软件]分布式应用开发框架 Apache Twill [软件]分布式流处理

深入理解JVM读书笔记: Class类文件结构

Class文件是一组以8位字节为基础单位的二进制流.采用一种类似于C语言结构体的微结构来存储数据,只有两种数据类型:无符号数和表.其中无符号数数据基本的数据类型,以u1.u2.u4.u8表示1.2.4.8字节的无符号数,用于描述数字.索引引用.数量值或者UTF-8编码字符串:表则是由无符号树和其他表的复合数据类型,以_info后缀.整个Class文件本质上就是一张表: 解析Class文件各个数据项含义: 魔数 头4个字节为魔数Magic Number,唯一作用是识别文件是否能被虚拟机接受. 版本

jvm 类文件结构学习

本文以代码示例来学习 java 类文件的结构,其中对类文件结构的学习均来自周志明先生所著的 <深入理解 Java 虚拟机>一书,在此表示诚挚的感谢. 代码如下: 1 package com.reycg.jvm; 2 3 public class ReferenceCountingGC { 4 5 public Object instance = null; 6 7 public static void testGC() { 8 ReferenceCountingGC objA = new Re