Java虚拟机(JVM)及其架构
在本文中,我们将了解Java虚拟机,使Java成为更受欢迎的。
我们都知道Java应用程序可以写一次并在任何地方运行多次。
只有JVM,这是可能的。
因为Java旨在在虚拟机上运行。
虚拟机是软件。
此JVM将在任何类型的硬件上运行。
所以它可以在任何地方运行。
当我们编译Java程序时。
将生成Class文件。
JVM将执行。
包含字节代码的CLASS文件。
和JVM负责首先调用主要方法,执行执行将启动。
现在我们将了解JVM架构。
JVM架构包括在机器上运行程序所需的主要组件。
JVM架构图
现在我们将详细地看到每个部分
类装载
类加载器子系统负责类加载,链接和初始化。
装载
此处加载程序将搜索类和负载按顺序。
它将包含3部分:
- Bootstrap类加载器:它加载与Java平台相关的类和在rt.jar中存在的引导路径中的类。实际上,rt.jar包含所有编译的类。
- 扩展类Loader:此处将加载将使用Java扩展机制的类。这些类将驻留在扩展目录中.jar文件。
- 应用程序类加载器:这些类是由用户定义的。使用类路径变量找到这些类。
为.class文件创建加载对象后。
它用于表示堆中的内存。
程序员使用该对象来检索信息。
链接
链接涉及验证,准备,解决。
- 验证它将验证字节代码是否正确格式化,这意味着类的二进制表示遵循结构约束。如果未遵循,则必须抛出验证错误。此错误是LinkAgeError的子类。
- 准备在此阶段的静态字段创建和初始化将完成。这意味着为静态变量分配内存和初始化。在初始化中,只有默认值将分配。
- 在此过程中的分辨率将以其直接引用(具体值)动态替换该过程中的分辨率。
初始化
在此阶段类和接口中将被初始化。
这将通过执行类或者接口的初始化方法来完成。
运行时数据区域(内存)
JVM在多个运行时数据区域组织内存。
对于执行程序,需要这些数据区域。
一些内存将在所有线程中共享。
现在我们将详细地看到这些数据区域。
- 方法区域:这是逻辑上的零堆空间,它将包含类骨架。它存储每个类结构意味着运行时常数和静态变量,方法,构造函数,类名以及类类型信息。它是一个共享资源。只有一个方法区域将驻留在JVM中。在运行时常量池字符串文字将被存储。这里的文字与任何对象实例无关。运行时常量池与对象实例无关。
- 堆:这里将存储有关对象的信息。如果我们将在堆空间中创建对象,将分配。如果对象死亡然后收集内存垃圾。它是所有线程之间共享的常见空间。
- 堆栈区域:它不是共享内存。每个线程将创建一个运行时堆栈。它包含局部变量,参数,中间结果和其他数据。它在方法调用和返回中发挥作用。 JVM在离散帧中存储线程信息。这些帧将以Push和Pop操作存储在JVM堆栈中。这里堆栈内存不需要是连续的,它是动态扩展的。如果内存不足以扩展,它将抛出内存错误。
- PC寄存器:每当创建新线程时,它将获取PC寄存器。 PC寄存器将存储要执行的当前指令的地址。
- 本机方法堆栈:本机方法堆栈将存储本机方法。这也不是共享资源。本机方法是Java方法,但实施将是C的另一种语言。这些方法通常用于接口系统调用和库。
执行引擎
执行引擎将执行运行时数据区域中的Java字节代码。
每个字节代码指令包含Opcode和操作数。
借助两个执行引擎将执行。
Java字节代码应更改为机器可理解。
它应该由编译器或者翻译完成。
翻译
它可以通过行解释字节代码指令行。
它可以比编译器更快地解释。
但重复的代码也应该再次解释。
这只是对口译员的缺点。
JIT编译器(就在时间)
它主要用于重复代码。
因为这是口译员的缺点,以补偿这个编译器进入图片的劣势。
编译器比翻译需要更多时间。
但这里JIT编译器将提高性能。
实际上,每个方法都将首先解释。
如果此方法的调用计数增加超过JIT阈值,则该方法将由JIT编译器编译。
JIT编译器将字节代码转换为本机代码。
之后只有本机代码将被执行。
这意味着JIT编译器将在适当的时间调用并根据方法频率进行操作。
Java本机接口
Java支持通过JNI接口的本机代码。
本机方法对于系统调用和与内存管理和性能问题有关的其他问题很有用。
JNI是一个将用于接口本机应用程序的框架。
它将启用Java应用程序来调用并通过本机应用程序调用。
本机方法库
这些本机方法库包含本机方法。
我们将看到一些使用为什么我们需要使用本机库。
我们的系统硬件可能具有一些特殊函数。
要使用这些特殊品质,我们需要本机方法。
有些本机方法提供另外的速度。
对于内存管理,还将设计某些本机方法。
通常,本机方法将以C或者C++写入。
这就是Java虚拟机(JVM)。