Java虚拟机是每个人都使用的东西,但并不是每个人都知道它是如何工作的。让我们看看JVM如何将您的工作变成字节码。
JVM是在其上执行Java代码的虚拟机。它负责将字节码转换为机器特定的代码。
热点JVM架构
图:HotSpot JVM架构
现在,让我们详细讨论JVM体系结构的每个组件。它由各种组件组成,我们将从类加载器子系统开始。
JVM的Classloader子系统
类加载器是JVM的子系统。Classloader用于加载类文件。它使用字节码验证器验证类文件。仅在有效时加载类文件。
JVM的运行时数据区
方法范围
方法区域也称为类区域。方法区域存储每个类的数据,例如字段,常量池以及方法数据和信息。
堆
堆是将所有对象存储在JVM中的地方。堆甚至包含数组,因为数组是对象。
Java线程(Java线程堆栈)
您必须知道每个线程都有自己的堆栈。线程调用新方法时如何创建堆栈框架?众所周知,每个线程都有自己的堆栈。每当调用新方法时,都会创建一个新的堆栈框架,并将其推入该线程的堆栈顶部。
线程堆栈包含什么?它们具有所有局部变量,所有参数和所有返回地址。堆栈从不存储对象,但它们存储对象引用。
程序计数器寄存器(PC寄存器)
程序计数器寄存器包含当前正在执行的指令的地址以及下一条指令的地址。
本机内部线程(本机线程堆栈)
本机内部线程包含与本机平台有关的所有信息。例如,如果我们在Windows上运行JVM,它将包含与Windows相关的信息。同样,如果我们在Linux上运行,它将包含我们需要的所有与Linux有关的信息。
执行引擎
执行引擎包含JIT(即时)编译器和垃圾收集器编译器,以及解释器
JIT编译器
JIT编译器在运行时将字节码编译为机器代码,并提高了Java应用程序的性能。
当然,JIT编译确实需要处理器时间和内存使用率。JVM首次启动时,将调用许多方法。尽管程序最终可能会获得良好的性能,但是编译所有这些方法可能会严重影响启动时间。
首次调用方法时,不会对其进行编译。对于每种方法,JVM都会维护一个调用计数,每次调用该方法时,该计数都会增加。JVM会解释这些方法,直到调用计数超过JIT编译阈值为止(JIT编译阈值可提高性能并帮助JVM快速启动。Java开发人员已仔细选择了该阈值以实现最佳性能。保持长期绩效)。
因此,JVM启动后,便会立即编译非常常用的方法,而稍后会编译较不常用的方法。
编译方法后,其调用计数将重置为零,并且对该方法的后续调用将增加其调用计数。当方法的调用计数达到JIT重新编译阈值时,JIT编译器将第二次编译该方法,与上一次编译中应用的优化相比,将应用更多的优化。重复此过程,直到达到最大优化级别。始终对最常用的方法进行优化,以最大程度地提高使用JIT编译器的性能。
假设JIT重新编译阈值= 2。
编译方法后,其调用计数将重置为零,并且对该方法的后续调用将增加其调用计数。当方法的调用计数达到2(即JIT重新编译阈值)时,JIT编译器将第二次编译该方法,并应用更多优化。
垃圾收集器
垃圾收集是JVM清除堆中的对象(未使用的对象)以回收堆空间的过程。
口译员
解释器负责读取字节码,然后执行指令。
JVM的本机方法库
本机方法接口是将JVM与本机方法库连接以执行本机方法的接口。
如果我们在Windows上运行JVM(Java应用程序),则本机方法接口(Windows方法接口)会将JVM与Window方法库(本机方法库)连接,以执行Windows方法(本机方法)。
您可以纯粹用Java编写应用程序,但是在某些情况下,仅Java代码可能无法满足您的要求。当无法完全用Java编写应用程序时,程序员可以使用JNI编写Java本机方法。
在此处阅读有关JNI的更多信息 。
与性能相关的最重要的JVM组件是:
- 堆
- JIT(Just In Time)编译器和
- 垃圾收集器
图:HotSpot JVM的关键组件以提高性能。
三个组件(堆,JIT(即时)编译器和垃圾收集器)与JVM的性能调整有关。
所有对象都存储在堆中,垃圾回收器在JVM初始化时管理堆。
有许多VM(JVM)选项用于:
- 增加和减少堆大小以管理对象以获得最佳性能。
- 根据您的要求选择不同的垃圾收集器。
同时,对于JIT编译器JIT:
- JIT编译器在运行时将字节码编译为机器代码,并提高了Java应用程序的性能。
- JVM的较新版本很少需要JIT编译器调整。
Java平台如何成为一种独立的语言?
一旦在一个平台上编译了源代码(即.java文件)(形成了字节码),就可以在运行JVM的任何其他平台上执行(解释)该字节码。
每个平台都有不同的JVM实现。从这里,您可以下载用于不同平台的JVM。例如,用于Windows的JVM与用于Linux的JVM不同。
此图有助于证明其独立性:
JVM是用于Java,Groovy,Scala和Clojure等语言的功能非常强大且灵活的运行时平台。JVM提供了大量的库,并且可以与Java完全互操作。