一、初识JVM
1.1 什么是JVM
JVM全称是Java Virtual Machine,中文译名Java虚拟机,JVM本质上是一个运行在计算机上的程序,它的职责是运行Java字节码文件,在字节码文件中包含了一连串的指令,这个指令就是字节码指令,这些指令是无法直接在计算机上运行的,因为计算机只能识别机器码,而Java虚拟机就负责将字节码转换成机器码从而让电脑识别,这个过程被称为解释,相当于将一门语言翻译成另一门语言。
1.2 JVM的功能
1.2.1 解释和运行
Java虚拟机可以将字节码文件中的指令实时的解释成机器码,让计算机执行
1.2.2 内存管理
- 自动为对象、方法等分配内存
- 自动的垃圾回收机制,回收不再使用的对象,不用像C/C++那样需要手动释放空间,降低了程序员写代码的难度
1.2.3 即时编译
- 对热门代码进行优化,提升执行效率
Java语言如果不做任何优化,其性能不如C/C++,因为Java语言需要将字节码指令通过JVM实时的解析为机器码才可以交给计算机运行,这个过程随着程序的执行,需要反复地执行,每次进行都需要花费一定的时间,而C/C++在编译过程中可以直接将源代码转换为计算机任何的机器码。
Java这样做的目的主要是为了支持跨平台特性,将一份字节码指令交给Linux、Windows平台,这些平台会安装不一样的JVM,分别将字节码解释成该平台上对应的机器码,实现了跨平台特性。
1.2.4 JVM 即时编译功能原理
有一个字节码文件,里面有一段字节码指令,虚拟机如果发现这段指令在很短时间内被多次调用,那么就会认为这段代码有必要去优化,会主动将代码解释并优化解析成机器码,然后将这个机器码保存在内存当中,这样当这段代码再次被执行时,就会直接从内存当中取出,直接调用。
- JVM利用即时编译(Uust-In-Time简称IT)进行性能的优化,最终能达到接近C、C++语言的运行性能
1.3 常见的JVM
名称 | 作者 | 支持版本 | 社区活跃度(github star) | 特性 | 适用场景 |
HotSpot(Open JDK版) | Oracle | 所有版本 | 高(闭源) | 使用最广泛,稳定可靠,社区活跃,JIT支持,Oracle JDK默认虚拟机 | 默认 |
HotSpot(Open JDK版) | Oracle | 所有版本 | 中(16.1k) | 同上,开源,Open JDK默认虚拟机 | 默认,对JDK有二次开发需求 |
GraalVM | Oracle | 11,17,19,企业版支持8 | 高(18.7k) | 多语言支持,高性能、JT、AOT支持 | 微服务、云原生架构,需要多语言混合编程 |
Dragonwell JDK,龙井 | Alibaba | 标准版8,11,17,扩展版11,17 | 低(3.9k) | 基于OpenJDK的增强,高性能、bug修复、安全性提升,JWarmup、ElasticHeap、Wisp特性支持 | 电商、物流、金融领域,对性能要求比较高 |
Eclipse OpenJ9,(原BM)9) | IBM | 8,11,17,19,20 | 低(3.1k) | 高性能、可扩展,JIT、AOT特性支持 | 微服务、云原生架构 |