JVM(Java虚拟机)是一种抽象机器。 它是一种提供运行时环境的规范,可以在其中执行 java 字节码。
JVM 可用于许多硬件和软件平台(即 JVM 取决于平台)。
什么是JVM
这是:
指定 Java 虚拟机工作的规范。 但实现提供者独立选择算法。 它的实现由 Oracle 和其他公司提供。
一个实现 它的实现被称为 JRE(Java 运行时环境)。
运行时实例 每当您在命令提示符下编写 java 命令以运行 java 类时,就会创建一个 JVM 实例。
它能做什么?
JVM 执行以下操作:
加载代码
验证代码
执行代码
提供运行环境
JVM 为以下内容提供定义:
内存区
类文件格式
寄存器组
垃圾收集堆
致命错误报告等
JVM架构
让我们了解一下JVM的内部架构。 它包含类加载器、内存区域、执行引擎等。
1) 类加载器
Classloader 是 JVM 的一个子系统,用于加载类文件。每当我们运行 java 程序时,它首先由类加载器加载。 Java中有三个内置的类加载器。
Bootstrap ClassLoader:这是第一个类加载器,它是 Extension 类加载器的超类。它加载包含Java标准版所有类文件的rt.jar文件,如java.lang包类、java.net包类、java.util包类、java.io包类、java.sql包类等。
Extension ClassLoader:这是Bootstrap的子类加载器和System类加载器的父类加载器。它加载位于 $JAVA_HOME/jre/lib/ext 目录中的 jar 文件。
System/Application ClassLoader:这是扩展类加载器的子类加载器。它从类路径加载类文件。默认情况下,类路径设置为当前目录。您可以使用“-cp”或“-classpath”开关更改类路径。它也被称为应用程序类加载器。
输出:
这些是 Java 提供的内部类加载器。 如果要创建自己的类加载器,则需要扩展 ClassLoader 类。
2)类(方法)区
Class(Method) 区域存储每个类的结构,例如运行时常量池、字段和方法数据、方法的代码。
3) 堆
它是分配对象的运行时数据区。
4) 堆栈
Java Stack 存储帧。 它保存局部变量和部分结果,并在方法调用和返回中发挥作用。
每个线程都有一个私有 JVM 堆栈,与线程同时创建。
每次调用方法时都会创建一个新框架。 框架在其方法调用完成时被销毁。
5) 程序计数器寄存器
PC(程序计数器)寄存器包含当前正在执行的 Java 虚拟机指令的地址。
6) 原生方法栈
它包含应用程序中使用的所有本机方法。
7) 执行引擎
它包含:
1、一个虚拟处理器
2、解释器:读取字节码流然后执行指令。
3、Just-In-Time(JIT)编译器:用于提高性能。 JIT 同时编译具有相似功能的部分字节码,从而减少编译所需的时间。 这里,术语“编译器”是指从Java虚拟机(JVM)的指令集到特定CPU的指令集的翻译器。
8) Java 原生接口
Java Native Interface (JNI) 是一个框架,它提供了一个接口来与用另一种语言(如 C、C++、Assembly 等)编写的另一个应用程序进行通信。Java 使用 JNI 框架将输出发送到控制台或与 OS 库进行交互。