本文仅供学习参考!
相关教程(文章)地址:
https://zhuanlan.zhihu.com/p/34426768
https://github.com/doocs/jvm
Java 虚拟机 (JVM) 是 Java 编程语言的关键组件,为跨大多数主要硬件、操作系统和软件架构执行 Java 代码提供了一个独立于平台的环境。在本文,我们将讨论 JVM 是什么、它如何工作以及它为开发人员提供的主要功能。
什么是 JVM?
Java虚拟机是一个虚拟“机器”,为Java应用程序和程序提供运行时环境。它的作用很简单:解释并执行 Java字节码,它是一段 Java 代码的编译形式的低级表示。当编译用 Java 编写的应用程序时,它们会生成字节码,字节码可以由任何 JVM 实现执行(或运行),而不管底层体系结构、硬件或操作系统如何。
Java 的 JVM 是平台无关的,这意味着 Java 程序可以编写一次并在任何 JVM 实现上运行 - 这一原则称为WORA或编写一次,在任何地方运行。WORA 的这一概念是通过 Java 代码与底层操作系统和硬件之间的抽象层实现的。在运行时,JVM 解释生成的字节码并将其转换为本机机器代码,考虑到它将运行的底层系统的特征。
Java虚拟机如何工作?
回答“JVM 是如何工作的?”这个问题。开发人员必须首先了解 JVM 遵循的步骤,以便解释 Java 代码,然后执行它。这些步骤包括:
- 加载字节码
- 验证字节码
- 准备内存资源
- 解释 Java 字节码
- 即时编译
- 垃圾收集
加载Java字节码
JVM 进程中发生的第一步涉及将 Java 字节码加载到 JVM 中。此任务由类加载器执行,其职责是找到任何必要的字节码文件并将它们加载到系统内存中。
确认
字节码加载到内存后,JVM 需要验证其正确性,方法是检查 Java 字节码是否违反 Java 语言规范,包括非法访问私有字段或私有方法。
准备字节码
一旦验证了字节码,Java 虚拟机就会准备执行程序所需的内存和资源。此准备工作包括为任何所需对象分配内存以及初始化静态变量。
解释Java字节码
接下来,JVM 必须解释字节码并顺序执行每条指令。执行每条指令时,JVM 会维护一个值堆栈,以供任何后续指令集使用。
即时编译
一旦代码被解释,JVM 就可以使用即时 (JIT) 编译来提高性能。在 JIT 编译过程中,JVM 将频繁执行的字节码编译为本机机器语言,其执行效率比解释的字节码更高。我们将在下面的部分中更详细地讨论 JIT。
垃圾收集
当应用程序执行时,Java 虚拟机通过执行自动垃圾收集来管理内存资源(分配和释放) 。垃圾收集会释放程序或 CPU 不再使用的内存资源,从而允许 JVM 回收这些内存并用于其他用途。
JVM 有哪些特点?
Java 虚拟机有几个关键特性,使其成为一个如此强大且宝贵的平台,包括平台独立性、内存管理、安全性、动态加载、JIT 编译和多线程:
- 平台独立性: JVM 包括一个独立于平台的运行时环境,允许在大多数硬件和软件架构上执行 Java 应用程序。
- 内存管理: JVM 通过其内置的垃圾收集器自动管理内存,当程序完成时会释放内存,从而使开发人员不必考虑内存分配和释放。
- 安全性: JVM 强制执行安全策略以防止恶意代码获取对系统资源的访问权限。
- **动态加载:**使用 Java 虚拟机,可以在运行时动态加载类,从而使开发人员可以扩展其 Java 程序的功能,而无需重新编译或重新部署。
- 即时编译: JIT 编译通过将频繁执行的字节码编译为本机机器语言来提高应用程序性能。
- 多线程: JVM 支持多线程,它允许 Java 程序同时运行多个执行线程。
什么是JIT?
正如所讨论的,JIT 是一种编译机制,可让 JVM 在运行时将频繁执行的字节码编译为本机机器语言。在执行 Java 应用程序期间,JVM 解释字节码并一次执行一条指令。这个过程可能很慢而且不是最优的,这就是 JIT 发挥作用的地方。
即时编译通过动态编译频繁执行的字节码,将其更改为本机机器代码来提高性能,这比解释的对应版本要高效得多。该本机代码存储在内存中,并在执行相同代码时重复使用,这进一步提高了应用程序性能。
JIT 如何运作?
如上所述,当执行 Java 程序时,JVM 会解释字节码并按顺序执行,一次一条指令。在此过程中,如果 JVM 检测到某段代码被频繁执行,它就会开始将该频繁使用的代码编译为本机机器代码。
JIT 编译器可以通过使用多种技术来优化编译代码的性能。例如,可以采用循环展开来消除循环控制结构的开销。内联方法可用于消除与方法调用相关的开销。
JIT有什么好处?
JIT 为 Java 开发人员提供了多种好处,包括改进的性能、更快的启动时间、自适应优化、平台独立性和共享编译代码:
-
**提高性能:**通过将频繁执行的字节码动态编译为本机机器代码来提高性能。
-
**更快的启动时间:**由于 JVM 仅编译频繁执行的代码,因此 Java 应用程序的启动时间要快得多。
-
**自适应优化:**JIT 编译器根据特定程序的执行配置文件调整代码优化策略,这有助于提高性能。
-
平台无关性: JIT编译让Java程序可以在许多不同的硬件和软件系统上运行,而不需要重新编译。
-
**代码共享:**由于编译后的代码存储在内存中并在后续执行时重用,因此 JIT 允许同一程序的多个实例共享编译后的代码。此操作有助于减少内存使用和资源。
END
在本文,我们了解了 Java 虚拟机 (JVM),以及它的工作原理、特性和优点。这包括为 Java 程序的运行提供一个独立于平台的运行时环境,无论它们部署在哪个系统上。JVM 解释 Java 字节码并在运行时将其转换为本机机器代码。
我们还讨论了 JIT 编译,它让 JVM 通过将频繁执行的字节码动态编译为本机机器代码来提高 Java 应用程序的性能。该技术提高了性能,减少了启动时间,采用自适应优化,提供平台独立性,并允许代码共享。