目录
-
- 1.什么是JVM
- [2.JVM 的职责](#2.JVM 的职责)
- 3.Java性能低的主要原因和跨平台特性
- [4.常见的 JVM 实现](#4.常见的 JVM 实现)
1.什么是JVM
JVM,全称 Java Virtual Machine,是 Java 平台的核心组成部分。它是一种虚拟计算机,能够在不同的操作系统上提供一个统一的运行环境给 Java 应用程序。通过 JVM,Java 语言得以实现"一次编写,到处运行"的跨平台特性。
JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。
Java源代码执行流程如下:
分为三个步骤:
1、编写Java源代码文件。
2、使用Java编译器(javac命令)将源代码编译成Java字节码文件。
3、使用Java虚拟机加载并运行Java字节码文件,此时会启动一个新的进程。
2.JVM 的职责
JVM 主要负责执行 Java 字节码文件,将这些字节码解释或编译成机器码,以便在特定的硬件平台上运行。此外,JVM 还负责内存管理、垃圾回收以及即时编译等任务。
解释和运行
对字节码文件中的指令,实时的解释成机器码,让计算机执行。
字节码文件中包含了字节码指令,计算器无法直接执行,Java虚拟机会将字节码文件中的字节码指令实时地解释成机器码,机器码是计算机可以运行的指令。
内存管理
- 自动为对象、方法等分配内存
- 自动的垃圾回收机制,回收不再使用的对象
Java虚拟机会帮助程序员为对象分配内存,同时将不用的对象使用垃圾回收器回收掉,这是对比C和C++这些语言的一个优势。在C/C++语言中,对象的回收需要程序员手动去编写代码完成,如果遗漏了这段删除对象的代码,这个对象就会永远占用内存空间,不会再回收。所以JVM的这个功能降低了程序员编写代码的难度。
即时编译JIT
为了提高性能,JVM 使用即时编译技术 将频繁执行的字节码片段编译成本地代码。这样可以显著提升程序的执行速度,尤其是在长期运行的应用中。
对热点代码进行优化,提升执行效率。即时编译可以说是提升Java程序性能最核心的手段。
3.Java性能低的主要原因和跨平台特性
Java语言如果不做任何的优化,性能其实是不如C和C++语言的。主要原因是:
在程序运行过程中,Java虚拟机需要将字节码指令实时地解释成计算机能识别的机器码,这个过程在运行时可能会反复地执行,所以效率较低。
C和C++语言在执行过程中,只需要将源代码编译成可执行文件 ,就包含了计算机能识别的机器码,无需在运行过程中再实时地解释,所以性能较高。
Java为什么要选择一条执行效率比较低的方式呢?主要是为了实现跨平台的特性 。Java的字节码指令,如果希望在不同平台(操作系统+硬件架构),比如在windows或者linux上运行。可以使用同一份字节码指令,交给windows和linux上的Java虚拟机进行解释,这样就可以获得不同平台上的机器码了。这样就实现了Write Once,Run Anywhere (编写一次,到处运行) 的目标。
但是C/C++语言,如果要让程序在不同平台上运行,就需要将一份源代码在不同平台上分别进行编译,相对来说比较麻烦。
所以,任何一门语言都有自身的优劣之处,我们没有必要去比较它们谁更强。好比我们身边的人和事,我们总不能让一个乒乓球世界冠军跟一个短跑世界冠军去打乒乓球比赛,或者是让他们去进行短跑比赛吧?所以,我们在短暂的人生之中,也要能学会看见自己的长处,不必因为他人在某些方面强于自己而刚到焦虑困苦。
再回到即时编译,在JDK1.1的版本中就推出了即时编译去优化对应的性能。
虚拟机在运行过程中如果发现某一个方法甚至是循环是热点代码(被非常高频调用),即时编译器会优化这段代码并将优化后的机器码保存在内存中,如果第二次再去执行这段代码。Java虚拟机会将机器码从内存中取出来直接进行调用。这样节省了一次解释的步骤 ,同时执行的是优化后的代码,效率较高。
Java通过即时编译器获得了接近C/C++语言的性能,在某些特定的场景下甚至可以实现超越。
4.常见的 JVM 实现
市面上存在多种 JVM 实现,其中最广为人知的是 Oracle 的 HotSpot 虚拟机,它被广泛用于生产环境中。其他流行的实现还包括 OpenJ9 和 GraalVM,它们提供了额外的功能和优化选项。
平时我们最常用的,就是Hotspot虚拟机。
名称 | 作者 | 支持版本 | 社区活跃度 (github star) | 特性 | 适用场景 |
---|---|---|---|---|---|
HotSpot (Oracle JDK版) | Oracle | 所有版本 | 高(闭源) | 使用最广泛,稳定可靠,社区活跃JIT支持 Oracle JDK默认虚拟机 | 默认 |
HotSpot (Open JDK版) | Oracle | 所有版本 | 中(16.1k) | 同上开源,Open JDK默认虚拟机 | 默认对JDK有二次开发需求 |
GraalVM | Oracle | 11, 17, 19企业版支持8 | 高(18.7k) | 多语言支持高性能、JIT、AOT支持 | 微服务、云原生架构需要多语言混合编程 |
Dragonwell JDK龙井 | Alibaba | 标准版8,11,17扩展版11,17 | 低(3.9k) | 基于OpenJDK的增强高性能、bug修复、安全性提升JWarmup、ElasticHeap、Wisp特性支持 | 电商、物流、金融领域对性能要求比较高 |
Eclipse OpenJ9 (原IBM J9) | IBM | 8,11,17,19,20 | 低(3.1k) | 高性能、可扩展JIT、AOT特性支持 | 微服务、云原生架构 |
本小节到此,待续、、、