文档下载
https://docs.oracle.com/javase/specs/index.html
两个文档:语言规范和虚拟机规范
参考书
周志明老师的书推荐
JVM:跨语言的平台。
java:跨平台的语言
JVM不仅可以解释java程序,其他编程语言也可以解释,只需要不同语言提供各自的编译器,编译出的字节码文件遵循JVM的规范,就可以运行
从JDK11开始,每次都会发布两个版本的JDK:一个OpenJDK、一个OracleJDK
OpenJDK支持期只有半年,半年以后如果发现JDK存在BUG, 那么只能升级JDK,没人维护
OracleJDK持续更新三年,但是如果商用化需要付费
openJDK, Hotspot虚拟机作为默认虚拟机
虚拟机
JVM的位置
JVM整体结构
方法区和栈是多线程共享的,java栈、本地方法栈和PC寄存器是每个线程独享的
执行引擎来把字节码翻译成汇编语言-》机器语言,进而成为机器指令
Java代码执行流程
二次编译:
首先java源码经过java编译器,也叫前端编译器,编译成字节码文件
然后字节码文件要经过JIT编译器编译,将字节码命令编译得到机器指令,同时机器指令是反复执行的热点代码
所以要进行缓存,放于方法区,方便直接调用,
JVM的结构模型
零地址指令:只有操作数,没有地址
一地址指令:一个地址,一个操作数
二地址指令:两个地址,一个操作数
以此类推
基于栈式的指令集,指令集小,但是因为是8位的指令,所以指令多。
基于寄存器的指令集,指令是16位的,很少的指令就能完成一项操作。但是对硬件依赖性强。
反编译操作
编译java文件后,在out文件夹下产生字节码文件
javap进行反编译
JVM是基于栈的指令集架构,编译需要8行
为什么不考虑把虚拟机架构改为基于寄存器呢?还是考虑到基于栈式的优点更多一点:指令集小等
JVM的生命周期
JVM发展历程
1、
开始的JVM执行引擎中只有解释器逐行执行,没有JIT编译器,所以速度慢,大家形成了java速度慢的印象,其实到现在来说,优化的速度已不亚于C和C++
JIT如果发现是热点代码,就会先编译成机器指令缓存起来,提升执行效率
解释器响应时间快,但是执行速度慢。而JIT有一个编译的过程,所以响应慢,但是执行速度快。
解释器和JIT还不能同时执行,所以优化的方法就是两者交替执行,由此达到最佳执行状态。
主流的虚拟机都提供解释器和即时编译器
总结:解释器响应快,但是执行慢,JIT即时编译器开始会有编译成机器指令的步骤,所以响应慢,但是执行快,当执行一段代码后又必须编译机器指令,又进入等待。
也就是说,hotspot里除了内置了classicVM,还有一个JIT.
2、
3、HotSpot VM
面试的时候如果面试官没提说哪个虚拟机,默认指的就是HotSpot
4、JRockit
没有解释器,只有编译器,所以执行速度快,启动速度慢
J9
三大商用虚拟机:Hotspot\JRockit\J9
taobaoJVM