1. 什么是JVM
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码字节码(class文件)并非只是由java语言编译而成
1、 JVM实际上可以看作是一个可运行Java代码的假象计算机,JVM通过C/C++来实际操作计算机执行逻辑运算和存储
2、 JVM实质上是运行在操作系统之上的,且无法与硬件直接交互,必须依靠于操作系统
3、 Java代码编译为Class文件后,通过执行引擎的编译和解释,将Class文件转换为操作系统对应的二进制码
Java代码通过native关键字,可以间接实现软硬件交互—调用C++/C的代码库 不同操作系统,JVM不同,但是不会影响代码的执行
JVM虚拟机的特点
- 跨平台性(一次编译,到处运行)
- 优秀的垃圾回收机制(自动内存管理,自动垃圾回收功能)
- 可靠的即时编译器
如上图所示,所有使用JVM作为虚拟机的平台语言,都具有JVM虚拟机所拥有的特性
JVM虚拟机的作用
- 负责装载字节码到其内部
- 解释编译为对应操作系统上的机器指令并执行
JVM在计算机系统中所处的位置
我们可以视为JVM是运行在操作系统上的软件,字节码文件的虚拟机
2.JVM版本介绍
2.1 Sun Classic/Exact VM
Sun Classic(JDK1.0)
- 世界上第一款商用的Java虚拟机
- 在JDK1.2以前一直使用的都是使用的Classic
- 该虚拟机是以纯解释器方式执行Java语言的
- 为了解决纯解释带来的执行效率慢的问题,提供了sunwjit(sun WorkShop JIT),外挂即时编译器,但是一旦使用即时编译器后,则JIT就会接管虚拟机的执行系统,解释器将无法继续工作,所有的工作都将交接给JIT
Exact VM(JDK1.2)
- 虚拟机可以知道内存中某一个位置的数据具体是什么类型
- 为了解决Classic的各种问题,提升运行效率,而诞生的一款准确式内存管理虚拟机,已具备了高性能虚拟机的雏形
- 高性能虚拟机的雏形:热点探测器、两级即时编译器、编译器与解释器混合工作模式等
但是很快就被HotSpot取代了
2.2 HotSpot(JDK1.3)
发展历程
- 由Longview Technologies公司设计,并非是为了Java语言而研发的,来源于Strongtalk虚拟机(为Self语言提供服务的虚拟机)
- 由Sun公司收购后,继承了之前两款虚拟机的优点,成为了目前广泛使用的HotSpot虚拟机
- JDK1.2时,使用java -hotspot可以切换HotSpot VM虚拟机
- JDK1.3时,HotSpot成为了默认虚拟机,,使用java -classic可以切换为classic虚拟机
- JDK1.4才正式将Classic退出JDK商用虚拟机舞台
特点:
- Sun/Oracle的JDK和Open JDK的默认虚拟机
- 服务器端、桌面到移动端、嵌入式都有应用
- HotSpot的热点探测技术可以通过执行计数器,找出最具有编译价值的代码,然后通知即时编译器以方法为单位进行编译,如果一个方法被频繁的调用,或者方法中有效循环次数很多,就会触发标准即时编译器和栈上替换编译行为
- 编译器和解释器的混合工作模式有效地平衡了最优响应时间和最佳执行性能
- JDK8时,又因Oracle收购了sun公司,将JR虚拟机和HotSpot融合,去除了永久代,添加了Java Mission Control
2.3 Mobile/Embedded VM
这是服务于移动端和嵌入式市场的
2.4 BEA JRockit/IBM J9 VM
BEA JRockit
-
JRockit内部使用的是纯即时编译器,因此号称是世界上最快的Java虚拟机
-
是一款服务端的硬件和服务端应用场景高度优化的虚拟机(启动速度慢,执行速度快)
-
JR的优势在于垃圾收集器和Java Massion Control故障处理套件(以极低的开销来监控、管理和分析生产环境中的应用程序工具)
-
有全面的Java运行时解决方案
-
延迟敏感应用解决方案提供毫秒或微秒级JVM响应
Java MissionControl服务套件
-
被Oracle收购后,将JR的优势融入到了HotSpot虚拟机中
IBM J9 VM
- J9是IBM公司内部项目的开发代号,原名应该是IT4J(IBM Technology for Java Virtual Machine)
- J9的定位和HotSpot非常相似,即全面考虑服务端和桌面应用,再到嵌入式开发等多种用途的虚拟机
- 虽然J9虚拟机的职责分离和模块化做得比HotSpot好,但是J9更适用于IBM内部产品
- 在IBM产品中是速度最快的JVM
2.5 BEA Liquid VM/Azul VM
与特定的硬件平台绑定的虚拟机软件
-
BEA Liquid VM也被称为JRockit VE,直接运行在Hypervisor系统上的JRockit版本
-
Azul VM是Azul Systems公司在HotSpot虚拟机的基础上改进后,专门运行于Vega系统的一款Java虚拟机
Azul VM实例可以管理至少数十个CPU和数百GB的硬件资源,提供了巨大的内存范围内停顿时间可控的垃圾收集器(PGC和G4)
2.6 Apache Harmony/Google Android Dalvik VM
-
Harmony虚拟机准确的说是Harmony中的DRLVM,DRLVM和DalvikVM只能称为虚拟机,并不能称为Java虚拟机。Apache Harmony是一个Apache软件基金会旗下以Apache License协议开源的实际兼容于JDK5和JDK6的Java程序运行平台,有自己的虚拟机和Java类库API,但是由于没有通过TCK的兼容性测试,导致它并不算实际意义上的Java虚拟机
-
Dalvik VM曾经是Android平台的核心组成部分之一,由于Dalvik VM没有遵循Java虚拟机规范,不能直接执行Java的Class文件,使用的是寄存器架构,而不是栈架构,因此也不能称为Java虚拟机,但是它执行的DEX(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序可以直接使用绝大部分的JavaAPI。
在Android4.4时代,支持提前编译(Ahead of Time Compilation,AOT)的ART虚拟机直接取代了Dalvik VM
2.6其他版本(了解即可)
Java ME
发布在Java ME产品线上的两款虚拟机CDC/CLDC HotSpot Implementation VM
KVM
KVM是CLDC-HI早期的产品,强调简单、轻量、高度可移植,但是运行速度比较慢,面向更低端的设备上还维持自己的市场
使用场景:
- 智能控制器、传感器
- 老人手机、经济欠发达地区的功能手机
Java Card VM
JCVM是Java虚拟机很小的一个子集,是Java虚拟机的阉割版,通常支持绝对多数的常用加密算法。用于精简的放入智能卡、SIM卡、银行信用卡、借记卡内,负责对Java Applet程序进行解释执行
Squawk VM
Squawk VM是由Sun开发,云星宇Sun SPOT(Sun Small Programmable Object Technology,一种手持的Wifi设备),也曾运用于Java Card。这是一个Java代码占比很高的嵌入式虚拟机实现,其中类加载器、字节码验证器、垃圾收集器、解释器、编译器和线程调度都是用Java完成的,仅仅使用C语言实现了设备IO和本地代码
JavaInJava
Sun公司使用Java语言来实现Java运行环境,即所谓的元循环(Meta-Circular,是指使用语言自身来实现其运行环境),它必须运行在另一个宿主虚拟机之上,内部没有即时编译器,代码只能以解释模式执行
Maxine VM
Maxine VM和上面的JavaInJava非常相似,也是一个几乎全部以Java代码实现(只有用于启动Java虚拟机的加载器使用C语言编写)的元循环Java虚拟机,比起JavaInJava,Maxine VM有着非常先进的即时编译器和垃圾收集器,可在宿主模式或独立模式下执行,其执行效率已经接近HotSpot虚拟机client模式下的水平。后来有了C1X编译器演进而来的Graal编译器的支持,执行效率有了进一步的提升
Jikes RVM
Jikes RVM是IBM开发的专门用于研究Java虚拟机实现技术的项目,也是一个元循环虚拟机
IKVM.NET
这是一个基于微软.NET框架实现的Java虚拟机,并借助Mono获得一定的跨平台能力。IKVM.NET可以将Class文件编译成.NET Assembly,在任意的CLI上运行
所有虚拟机的原则:一次编译,到处运行
如何查看自己的JVM是哪一种?
重点
Graal VM(跨语言全栈式虚拟机)
- 口号:Run Programs Faster Anywhere
- 将多种语言的源代码或源代码的中间格式转换为一种统一的中间表示
- Graal VM提供了Truffle工具集来快速构建面向一种新语言的解释器,并用他来构建了一个称为Sulong的高性能LLVM字节码解释器
新一代(JIT)即时编译器
HotSpot虚拟机中含有两个即时编译器
1、 C1编译器:编译耗时短,但是输出代码优化程度低的客户端编译器
2、 C2编译器:编译耗时长,但是输出代码优化质量高的服务端编译器
在JDK10起,HotSpot将C2编译器换成了Graal编译器(Java语言写成的),实现时又刻意与C2编译器采用了同一种名为Sea-of-Nodes的高级中间表示(High IR)形式,Graal编译器能够做比C2更复杂的优化,例如:部分逃逸分析,也拥有比C2更容易使用激进预测性优化的策略,支持自定义的预测性假设等
在分层编译机制下与解释器相互配合共同构成HotSpot虚拟机的执行引擎(子系统)