Java - 虚拟机 JVM 架构



JVM (Java Virtual Machine) 是一种抽象机器。它是一个提供可以执行 java 字节码的运行时环境的规范。

JVM 可用于许多硬件和软件平台(即 JVM 依赖于平台)。

什么是 JVM

  • 工作规范 :指定了 Java 虚拟机工作的规范。但是 implementation provider 是独立于选择算法的。其实施由 Oracle 和其他公司提供。
  • An implementation:它的实施称为 JRE(Java 运行时环境)。
  • Runtime Instance :运行时实例每当在命令提示符上编写 java 命令以运行 java 类时,都会创建一个 JVM 实例。

它能做什么

JVM 执行以下操作:

  • 加载代码
  • 验证代码
  • 执行代码
  • 提供运行环境

JVM 提供了以下各项的定义:

  • 内存区域
  • 类文件格式
  • 寄存器集
  • 垃圾回收堆
  • 致命错误报告等

JVM 架构

让我们了解 JVM 的内部架构。它包含类加载器、内存区域、执行引擎等。

JVM 架构

1) Classloader

Classloader 是 JVM 的一个子系统,用于加载类文件。每当我们运行 java 程序时,它首先由 classloader 加载。Java 中有三个内置的类加载器。

  • Bootstrap ClassLoader:这是第一个 classloader,它是 Extension classloader 的超类。它加载 rt.jar 文件,其中包含 Java 标准版的所有类文件,如 java.lang 包类、java.net 包类、java.util 包类、java.io 包类、java.sql 包类等。
  • Extension ClassLoader:这是 Bootstrap 的子 classloader 和 System classloader 的父 classloader。它加载位于 $JAVA_HOME/jre/lib/ext 目录中的 jar 文件。
  • System/Application ClassLoader:这是 Extension 类加载器的子类加载器。它从 classpath 加载 classfile。默认情况下, Classpath 设置为 current directory。您可以使用 “-cp” 或 “-classpath” 开关更改 Classpath。它也被称为 Application 类加载器。

让我们看一个打印 classloader 名称的示例


//	
public class ClassLoaderExample 	
{ 	
	 	 public static void main(String[] args) 	
	 	 { 	
	 	 	 	 // 让我们打印当前类的 classloader 名称。		
	 	 	 	 // Application/System 类加载器将加载此类 	
	 	 	 	 Class c=ClassLoaderExample.class; 	
	 	 	 	 System.out.println(c.getClassLoader()); 	
	 	 	 	 // 如果我们打印 String的 classloader 名称,它将打印null,因为它是一个	
	 	 	 	 // 在rt.jar中的内置类中,因此它是由Bootstrap类加载器加载的
	 	 	 	 System.out.println(String.class.getClassLoader()); 	
	 	 } 	
} 	 		

 

输出:

sun.misc.Launcher$AppClassLoader@4e0e2f2a
null

这些是 Java 提供的内部类加载器。如果要创建自己的类加载器,则需要扩展 ClassLoader 类。

2)Class(Method) 区域

Class(Method) Area 存储每个类的结构,例如运行时常量池、字段和方法数据、方法代码。

3) 堆

它是分配对象的运行时数据区域。

4) 堆栈

Java Stack 存储帧。它保存局部变量和部分结果,并在方法调用和返回中发挥作用。

每个线程都有一个私有 JVM 堆栈,与 thread 同时创建。

每次调用方法时,都会创建一个新帧。当 Frame 的方法调用完成时,该帧将被销毁。

5) 程序计数器注册

PC(程序计数器)寄存器包含当前正在执行的 Java 虚拟机指令的地址。

6) 原生方法堆栈

它包含应用程序中使用的所有本机方法。

7) 执行引擎

它包含:

  • 虚拟处理器
  • 解释程序:读取字节码流,然后执行指令。
  • 即时 (JIT) 编译器:它用于提高性能。JIT 编译同时具有相似功能的字节码部分,从而减少编译所需的时间。在这里,术语“编译器”是指从 Java 虚拟机 (JVM) 的指令集到特定 CPU 的指令集的转换器。

8) Java 原生接口

Java 本机接口 (JNI) 是一个框架,它提供了一个接口,用于与以其他语言(如 C、C++、汇编等)编写的另一个应用程序进行通信。Java 使用 JNI 框架将输出发送到控制台或与操作系统库交互。