1.1 java从代码到执行的过程
分成两个部分:
部分一:JAVAC部分,将源代码文件通过JAVAC的指令生成对应的CLASS文件。
部分二:java部分 class文件通过classloader加载内存总,还需要支持相应java类库,比如String.class或着Object.class调用字节码解释器活着JIT即时编译器,来进行解释和编译,编译之后会由执行引擎开始进行执行,执行引擎对应的就是OS硬件和操作系统,我们可以把java指令部分的流程看成JVM
1.2跨平台的语言,到跨语言的平台
跨平台的语言–java
跨语言的平台–jvm
JVM支持很多其他语言,任何语言只要能生成class文件,那就可以在JVM上执行。如果没有class文件生成,但是可以通过程序内部编译生成类似class文件的二进制流,也可以执行。这么多语言都可以在JVM上执行。其实JVM就是一种规范,它帮我们屏蔽了操作系统底层,包括linux,unix这样的系统。
1.3常见JVM的实现
Hotspot oracle官方的
j9 —IBM
Micrsoft VM
TaoBAOVM----Hotspot定制版
JDK和JRE和JVM的关系?
JVM:虚拟机用于执行CLASS文件,用来执行程序
JRE:java运行时的环境,除了虚拟机以外还需要java的核心包,java的类库要加载,能够支持java的运行
JDK:java的开发工具包 jre+jvm
2.CLASS文件结构
2.1 class file format
生成class文件使用IDEA进行反编译
其实不管文件格式,在内存中都是0101二进制流存储的,class文件是一组以8字节为基础单位的二进制流,各项数据会严格按照顺序紧凑排列,中间没有分隔符,使得class文件中存储的内容几乎是全部程序运行的程序。
2.2class 文件结构的解析
java虚拟机规定class文件结构由:无符号数和表组成
无符号数:属于基本数据类型,主要用来描述数字,索引符号 ,数量值或者按照UTF-8编码构成字符串的值。
数据类型:u1,u2,u4,u8该数据类型是从逻辑上分的类型分别表示1,2,4,8,个字节
表:是由多个无符号或者其他表作为数据项构成的复合数据类型,所有的表都习惯以_info来结尾,表主要描述有层次关系的复合结构的数据,比如:方法,字段,需要注意的是class文件没分隔符,所以每个二进制文件数据类型都是严格定义的,具体的顺序为:
魔数:class文件头4个字节用于识别身份CA FE BA BE是class文件的识别魔数。紧跟着的4个字节是class的版本号。版本号分为:次版本号前两个字节用来表示次版本号。主版本号后两个字节用来表示主版本号。版本号是随着JDK版本的不同二表示不同的版本范围。0x0034对应52也就是jdk1.8版本(从45开始)
2.21 常量池
紧跟在版本号后是常量池入口,常量池简单理解为class文件的资源库
1.是class文件结构中与其他项目关联最多的数据类型
2.是占用class文件空间最大的数据项目之一
3.是在文件中第一个出现表的数据项目
由于常量池中的常量数量不固定,所以在入口放U2类型的数据,代表常量池容量计数值constant_pool_count是从1开始计数的。class文件结构中只有常量池的容量计数从1开始的。第0项腾出来满足后面某些指向常量池的索引值数据在特点情况下需要表达“不引用任何一个常量池项目”的意思,这样的情况我们把索引值为0来表示留给自己虚拟机使用,尽管列表没0的入口,缺失的这个入口也会被constant_pool_count计数在 内。例如constant_pool为14项constant_pool_count为15
常量池两大常量:
字面量:如文本字符串,被声明为final的常量值。
符号引用:属于编译原理方面理念,包括:类和接口的全限定名,字段的名称和描述符,方法的名称和描述符
2.2 access_flag
标志的源码,用于对该类或接口的访问权限以及该类和接口的属性
ByteCode安装
1.javap指令
2.JBE插件
3.jclasslib IDEA插件之一
2.28 常量池详细解析
常量类型总共有18个编号的常量类型
编号一CONSTANT_UTF8_INFO
tag1------占用一个空间字节
length:utf8字符串占用字节数
bytes长度为length字符串
编号三CONSTANT_integer_info
bytes4个字节big——endian(高位在前)存储int类型的值
编号四CONSTANT_float_info
bytes4个字节big——endian(高位在前)存储float类型的
编号五CONSTANT_long_info
bytes8个字节big——endian(高位在前)存储long类型的
编号六CONSTANT_double_info
bytes8个字节big——endian(高位在前)存储double类型的