Java从编码到执行
我们普通的java源文件需要经过javac命令编译后变成class文件,这个过程是在硬盘执行的,然后通过java命令将class文件加载进内存(这个时候java类库也会加载进内存),经过字节码解释器或者JIT即时编译器之后会到执行引擎这,最后会到我们的OS硬件上,这个是java文件的一个大概执行流程。
那么在这里要解释一下字节码解释器和JIT即时编译器,有很多人问java是解释执行的还是编译执行的,其实解释还是编译是可以混合的,常用的代码用道德次数多会用即时编译器,下次再执行就不需要再一句一句解释来执行了,执行引擎可以直接交给操作系统,这个效率会高很多,但并不是所有的代码都会交给JIT即时编译的这样的话整个java就变不成跨平台了,所以有一些特定的或者经常使用的代码可以定义即时编译器。
我们平常测试jdk版本的时候后面这个mixed mode就是这两种的混合。
从跨平台的语言到跨语言的平台
有很多语言都可以在JVM虚拟机上运行,那么这些语言是跨平台的语言,换个思路来说,JVM就是跨语言的平台,那么这些可以在JVM虚拟机上运行的语言有什么样的特点呢?
JVM与class文件格式
其实,jvm与java无关,任何语言只要能变成class就可以在JVM上运行。不一定是编译成class文件,有的实在执行的过程之中形成二进制class流文件扔给jvm也可以运行。
jvm虚拟机是一种规范,是虚构出来的一台计算机,它包括字节码指令集(汇编语言)和 内存管理:堆栈方法区等。(查看Oracle网站https://docs.oracle.com/javase/specs/jvms/se16/jvms16.pdf)
常见的JVM实现
那么JVM既然是一种规范,就一定有实现,常见的JVM实现有以下几种:
Hotspot
-oracle官方,我们做实验用的JVM
-java -version
Jrockit
-BEA,曾经号称世界上最快的JVM
-被Oracle收购,合并于hotspot
J9-IBM
Microsoft VM
Taobao VM
-hotspot深度制定版
LiquidVM
-直接针对硬件
azul zing(商业版的)
-最新垃圾回收的业界标杆
-www.azul.com
JDK JRE JVM
那么来简单总结一下JVM和JDK以及JRE的区别与联系吧
JDK=jre+development kit
JRE=jvm+core lib
JVM
Class类文件结构
如果感兴趣的小伙伴想要深入了解class文件怎么执行代表什么意思,就去研究以下Class类文件结构吧,一定会有收获的,我在这里就简单的提一下。
● Class文件是一组以8字节为基础单位的二进制流,
● 各个数据项目严格按照顺序紧凑排列在class文件中,
● 中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序。
Java虚拟机规范规定,Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:无符号数和表。
无符号数
属于基本数据类型,主要可以用来描述数字、索引符号、数量值或者按照UTF-8编码构成的字符串值,大小使用u1、u2、u4、u8分别表示1字节、2字节、4字节和8字节。
表
是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有的表都习惯以“_info”结尾。表主要用于描述有层次关系的复合结构的数据,比如方法、字段。需要注意的是class文件是没有分隔符的,所以每个的二进制数据类型都是严格定义的。具体的顺序定义如下:
在class文件中,主要分为魔数、Class文件的版本号、常量池、访问标志、类索引(还包括父类索引和接口索引集合)、字段表集合、方法表集合、属性表集合。
这是我对JVM虚拟机近期的见解,欢迎小伙伴们来交流沟通~