一、JVM 历史:
1、Sun Classic VM (虚拟机始祖 )
JDK1.0版本 - 1.2版本,1.3版本作为备用的虚拟机,1.4版本淘汰。
特点:只能使用纯解释器的方式来执行Java代码,使用JIT编译器就要使用外挂。
tips:执行代码可分为编译执行和解释执行,解释执行指的是边解释边运行代码。编译执行指的是先编译,后执行。
2、Sun Exact VM
JDK1.2版本发布,解决Classic VM遇到的问题:解释器和编译器无法同时工作的问题;还具有一些现在高性能处理器的特性。
一直没有真正大规模使用。
3、Sun HotSpot VM
JDK1.3版本发布--至今,现在JDK使用的就是这款。
4、其他
BEA JRockit
IBM J9 VM
二、什么是虚拟机
Java虚拟机就是一个字节码翻译器,将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行。
三、源代码到字节码的过程
1、编译器
2、前端编译器(源代码到字节码)
javac编译器处理过程:
a、词法、语法分析(就是这个阶段JVM要搞懂源代码是要干嘛的);
b、填充符号表(类之间会互相引用的,在编译阶段,无法确定其具体的地址,会使用一个符号来替代,等到类加载阶段,JVM会把符号替换成具体的内存地址);
c、注解处理(根据注解的作用将其还原成具体的指令集);
d、分析与字节码生成(生成 .class文件)。
3、JIT编译器(字节码到机器码)
运行字节码有两种方式:
使用Java解释器解释执行字节码(启动速度快,边解释边执行);
使用JIT编译器将字节码转换成本地机器码(启动速度慢,运行效率高)。
通常是两种相结合的方式进行Java代码的编译执行。
HotSpot虚拟机内置两种即时编译器:
编译器 :Client Compiler 编译模式 :C1
编译器:Server Compiler 编译模式:C2
4、AOT编译器(源代码到机器码)
基本思想:在程序执行前生成Java方法的本地代码,以便程序运行时直接使用本地代码。
AOT编译器的存在是JVM牺牲质量换取性能的一种策略。
编译速度:解释执行 > AOT编译器 > JIT编译器
编译质量:JIT编译器 > AOT编译器 > 解释执行
JVM中通过这几种不同方式的配合,使得JVM的编译质量和运行速度达到最有的状态。