文档章节

JVM - 类文件结构

i
 itititit
发布于 2017/08/21 16:43
字数 883
阅读 7
收藏 0

class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,没有空隙和分隔符。当遇到需要占用8位以上的空间时,按照高位在前的方式分割成若干个8位字节存储。

class文件中只有两种数据类型:无符号数和表。

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

表是由多个无符号数或者其他表作为数据项构成的符合数据类型,所有表习惯性的以”_info“结尾。整个class文件本质就是一张表,由多个数据项构成:

魔数:u4,CAFEBABE

Class文件的版本号:u2次版本号,u2主版本号,java版本号从45开始。高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式未发生改变,虚拟机也必须拒绝超过版本号的Class文件。

常量池:由于数量不固定,常量池前放置u2类型的数据,代表常量池计数值,这个容量计数值从1开始。设计者将0项常量空出来是为了满足后面某些指向常量池的索引值的数据在特殊情况下需要表达”不引用任何一个常量池项目“的含义。对于其他表类型都是从0开始。

常量池主要存放两大类常量:字面量和符号引用。字面量比较接近java语言层面的常量概念;而符号引用则属于编译原理方面的概念,包括一下三类常量:

  1. 类和接口的全限定名。
  2. 字段的名称和描述符。
  3. 方法的名称和描述符。

常量池中的每一项都是一个表,JDK1.7之前共有11中,JDK1.7增加了3种。这14种表的共同点是表的开始第一位是一个u1类型的标志位,代表当前常量属于哪一种常量类型。14种常量类型如下:

如标志为7为CONSTANT_Class_info,代表类或接口的符号引用,其结构如下:

tag是标志位,上面已经讲过,它用于区分常量类型。name_index是一个缩索引值,它指向常量池中一个Constant_utf8_info类型常量,此常量代表这个类的全限定名。

CONSTANT_UTF8_info类型的常量结构如下:

length说明这个U    TF-8编码的字符串长度是多少个字节,它后面紧跟着长度为length字节的连续数据是一个使用UTF-8缩略编码表示的字符串。

javap分析Class文件字节码的工具 -verbose。

这14种常量项的数据结构定义如下:

 

访问标志:u2,这个标志用于识别类或接口层次的访问信息

类索引、父类索引与接口索引集合:。。。

字段表集合:用于描述接口或类中声明的变量。字段包括类级别变量以及实例变量,但不包含方法内部声明的局部变量。字段表结构如下:

方法表:。。。

属性表:。。。

 

 

© 著作权归作者所有

i
粉丝 0
博文 24
码字总数 15531
作品 0
私信 提问
1-Java基础语法-Java初识

欢迎大家来到java世界 带领大家领略编程的奥秘。 人与人沟通需要语言。计算机世界的沟通语言。 Java语法结构,使用循环和选择流控制结构,了解方法和数组的使用。 Java简介 Java是一门编程语...

天涯明月笙
2018/07/29
0
0
JAXB 应用指南

文章转自:http://blog.csdn.net/darxin/article/details/4845820 JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应...

红薯
2011/08/06
4.8K
0
Java虚拟机JVM内部体系结构

Java虚拟机JVM内部体系结构 易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。 JVM(Java虚拟机)是一个抽象...

LYQ1990
2018/07/18
230
0
什么是Java语言?java语言简介

Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的W...

阿秀a
2010/10/19
0
0
深入理解JVM学习笔记(一、总览)

1、JVM历史 2、JVM内存结构 3、JVM垃圾回收机制 4、JVM性能监控工具 5、JVM性能调优案例时间 6、JVM类文件结构 7、JVM类加载机制 8、JVM字节码执行引擎 9、JVM虚拟机编译及其运行时优化 10、...

jintaohahahaha
2018/05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
7
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
9
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部