1.字节码
(1)bytecode是构成平台无关性的基石

(2)当jvm发展到1.7-1.8的时候,jvm设计者通过,JSR-292,基本可以让其他语言运行在jvm上面。
如,Clojure , Groovy , JRuby , Jython , Scala

(3)jvm不和包括java在内的任何语言绑定, 它只和Class文件这种二进制文件格式关联。
Class文件,包含了jvm 指令集 和 符号表 ,以及其他若干信息。

(4)虚拟机不关心class文件的来源是何种语言。

java程序(*.java) --> java编译器

JRuby程序(*.rn) --> jruby编译器
---->字节码(*.class) -->java虚拟机
Groovy程序(*.groovy) --> groovy编译器

其他语言 --> 其他编译器

2.Class文件结构
概念:
(1)class文件,并非一定是一个磁盘文件,类或者接口也可以通过类加载器直接生成。
(2)class文件,是一组以8位字节为基础单位的二进制流。没有任何分割符号。
(3)class文件格式采用一种类似于C语言的结构体的伪结构来存储数据。
这种为机构只有两种数据类型:无符号数 和 表。

a.无符号数,属于最基本的数据类型,以u1 , u2 , u4 , u8 分别代表 1个字节 , 2个字节 , 4个字节 , 8个字节
可以用来描述,数字、索引引用、数量值、字符串

b.表,由无符号数,或其他表,作为数据项构成的,复合型数据类型。
所有的表习惯性的以 ”_info“ 结尾。
用于描述有层次关系的复合结构的数据。
整个class文件本质上就是一张表。
结构:
(4)魔数
a.每个Class文件的头四个字节称为魔数(Magic Number) ,它的唯一作用是用来确定这个文件是否能被jvm所接受的Class文件。
值为:0xCAFEBABE

(5)版本号
a.紧跟着魔数的四个字节,存储的是class文件的版本号:
第5和第6个字节是次版本号,第7和第8个字节是主版本号。
b.java版本号是从45开始的,JDK1.1之后的每个大版本发布,主版本号向上加1
JDK1.1支持: 45.0 ~45.65536
JDK1.2支持: 46.0 ~46.65536
JDK1.3支持: 47.0 ~47.65536
JDK1.4支持: 48.0 ~48.65536
JDK1.5支持: 49.0 ~49.65536
JDK1.6支持: 50.0 ~50.65536
JDK1.7支持: 51.0 ~51.65536
JDK1.8支持: 52.0 ~52.65536
c.高版本的JDK能向下兼容以前版本的Class文件,但低版本不能运行高版本的Class文件。即使文件格式没有发生变化,虚拟机也必须
拒绝执行,超过其版本号的Class文件

d.jdk的版本号和jvm的版本号对应。

(6) 常量池(每个Class文件都有)
a.紧接着主次版本号的是常量池入口,常量池可以理解为Class文件中的资源仓库,第一个出现的表类型数据结构。
由于常量池常量的数量是不固定的,所以,在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值(constant_pool_count)。
这个计数值是从1而不是从0开始的。因为某些指向常量池的索引值在特定情况下需要表达,不引用任何一个常量池。

b.存放:
字符串,声明为final的常量值。
类和接口的全限定名(com.lvyf.Test)
字段的名称和描述
方法的名称和描述,不包括方法返回值

c.*.java文件在进行,javac编译的时候,并不像C有连接这一步,而是在jvm加载Class文件的时候进行动态连接。也就是说,Class文件不会
保存各个方法,字段,的内存布局。因此,这些字段、方法不经过运行期转换的话无法得到内存地址,也就无法被虚拟机使用。
(就是 javac在编译的时候,把方法字段需要的内存信息,放到常量池,而不给方法和字段分配内存地址)当JVM运行Class文件时,
需要从常量池,获取对应的符号引用,再在类创建或者运行时解析、翻译到具体的内存地址。

d.java常量池有个计数器(因为常量池是不固定的,需要有计数器保存常量池长度),计数器数据类型是u2(2个字节2的16次方,65536),所以
java中如果定义超过64KB的英文变量名或者方法名,将会无法编译。

(7)访问标志
常量池结束之后,是访问标志(access_flag),识别类或者接口的访问信息
a.Class是类还是接口
b.是否为public类型
c.是类的话,是否为abstract类型
d.是否为final类型

(8)字段表集合field_info,用于描述接口或类中的变量
包括类变量,和实例级变量,不包括局部变量
a.字段的作用域(public , private , protected)
b.是实例变量还是类变量(static修饰)
c.可变性(final修饰)
d.并发可见性(volatile修饰,是否强制从主内存读写)
e.是否可被序列化(transient修饰)
f.字段类型(8中基本类型,对象,数组)
h.字段名称。
各个修饰符都是boolean值

(9)方法表集合,
a. 访问标志
名称索引
等。。。
b.code,方法里面的代码,经过编译成字节码后,存放在方法表集合中一个名为code的属性里面,接口没有code属性
code最大值也是65536
c.在java语言中,要重载一个方法,除了要与原方法有相同的名字,还要求必须与原方法有一个不同的特征签名,
特征签名,就是方法信息在常量池中的描述,这个描述,不包括方法的返回值,所以,不能根据返回值的不同,来重载方法。
要根据参数类型和参数个数,来重载方法。

(10)max_stack
代表了操作数栈深度的最大值。在方法执行的任意时刻,操作数栈都不会超过这个深度。

(11)max_locals
代表了局部变量所需的存储空间。单位是slot ,slot是虚拟机为局部变量分配内存的最小单位。
对于byte,char,float,int,short,boolean等长度不超过32位的数据类型,需要1个slot,
double,long需要两个slot

jvm--1.class文件结构的更多相关文章

  1. 深入理解JVM(六)类文件结构

    6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...

  2. JVM(4) 类文件结构

    一.实现“平台无关性” 字节码(ByteCode)存储格式和虚拟机是实现语言无关性的基础.Java虚拟机不和包括Java在内的任何语言绑定,它只与“Clas”文件这种特定的二进制文件格式所关联,Cla ...

  3. JVM之Class文件结构

    每一个class文件对应一个类或者接口,但是一个类或者接口不一定生成class文件,classloader直接生成. 8为字节为基础的二进制流,各个数据项按照严格的顺序排列在class文件中,没有任何 ...

  4. JVM初探之类文件结构

    java 的 .class 文件字节码如图:Class 文件是一组以8字节为基础单位的二进制流,各个数据项目有着严格的结构.下面我们介绍下class文件的结构. 魔数 class文件的头4个字节是魔数 ...

  5. JVM小结--类文件结构

    字节码是构成Java平台无关性的基石.实现语言无关性的基础是虚拟机和字节码存储格式. Java语言中的各种变量.关键字和运算符的语义最终是由多条字节码命令组成,因此字节码命令所能提供的语义描述能力肯定 ...

  6. 【JVM】虚拟机类加载机制

    什么是类加载 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. <[JVM]类文件结构& ...

  7. Java Class文件详解

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

  8. 我的阿里之路+Java面经考点

    我的阿里之路+Java面经考点 时间:2018-03-19 23:03  来源:未知   作者:admin   点击:87次 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三 ...

  9. JVM基础系列第5讲:字节码文件结构

    温馨提示:此篇文章长达两万字,图片50多张,内容非常多,建议收藏后再看. 前面我们说到 Java 虚拟机使用字节码实现了跨平台的愿景,无论什么系统,我们都可以使用 Java 虚拟机解释执行字节码文件. ...

  10. JVM学习04:类的文件结构

    JVM学习04:类的文件结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 类的文件结构知识要点Xmind梳理

随机推荐

  1. MongoDB 导出、导入表

    var srcTbl = "20161226"; var destTbl = "20161226-bak";   方式一: MongoClient client ...

  2. codevs 2830 蓬莱山辉夜

    2830 蓬莱山辉夜 http://codevs.cn/problem/2830/ 题目描述 Description 在幻想乡中,蓬莱山辉夜是月球公主,居住在永远亭上,二次设定说她成天宅在家里玩电脑, ...

  3. [LeetCode] Optimal Account Balancing 最优账户平衡

    A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for ...

  4. [LeetCode] Remove Element 移除元素

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  5. IT培训行业揭秘(一)

    最近一个多月来,身边有很多朋友问我,我家孩子明年就要大学毕业了,现在工作还没有着落,最近孩子回家经常和我说,他们学校最近来了很多IT培训班,让同学们参加培训,然后各个培训班动辄拿出往届他们的培训学生赚 ...

  6. RTMP流媒体播放过程

      RTMP协议规定:第一步,建立一个网络连接(NetConnection):客户端和服务端的基础连通关系 第二步:建立一个网络流(NetStream)发送多媒体的通道(只能建立一个网络连接,可以建立 ...

  7. Newtonsoft.Json 序列化和反序列化 时间格式【转】

    1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg:   A a=new A(); a.Name="Elain ...

  8. 递推 hdu 2064

    z[n] n个盘子从1到3次数 先想2个的时候  1->2 2->3  1->2 3->2 2->1 2->3 1->2 2->3 显然 要先把上面n- ...

  9. electron 入门小白贴

    electron 入门小白贴 electron demo 跑起来! 毕设准备是做个 跨平台的做题的客户端,打算用 electron 来弄. 然而今天折腾了半天才终于吧demo给跑起来了.经历了许多的问 ...

  10. JNI开发的常见错误

    1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...