📜  Java虚拟机

📅  最后修改于: 2020-09-25 02:17:35             🧑  作者: Mango

JVM(Java虚拟机)体系结构

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类加载器的超类。它会加载rt.jar文件,其中包含Java Standard Edition的所有类文件,例如java.lang包类,java.net包类,java.util包类,java.io包类,java.sql包类等。
  • 扩展ClassLoader :这是Bootstrap的子类加载器,是System类加载器的父类加载器。它加载$ JAVA_HOME / jre / lib / ext目录中的jar文件。
  • System / Application ClassLoader :这是扩展类加载器的子类加载器。它从类路径加载类文件。默认情况下,classpath设置为当前目录。您可以使用“ -cp”或“ -classpath”开关更改类路径。它也被称为应用程序类加载器。
"//Let's see an example to print the classloader name  
public class ClassLoaderExample  
{  
    public static void main(String[] args)  
    {  
        // Let's print the classloader name of current class.   
        //Application/System classloader will load this class  
        Class c=ClassLoaderExample.class;  
        System.out.println(c.getClassLoader());  
        //If we print the classloader name of String, it will print null because it is an  
        //in-built class which is found in rt.jar, so it is loaded by Bootstrap classloader  
        System.out.println(String.class.getClassLoader());  
    }  
}     

输出:

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

2)类别(方法)区域

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

3)堆

这是在其中分配对象的运行时数据区域。

4)堆叠

JavaStack存储框架。它保存局部变量和部分结果,并在方法调用和返回中起作用。

每个线程都有一个专用的JVM堆栈,与该线程同时创建。

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

5)程序计数器寄存器

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

6)本机方法堆栈

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

7)执行引擎

它包含了:

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

8)Java本机接口

Java本机接口(JNI)是一个框架,提供与使用C,C++,Assembly等其他语言编写的另一个应用程序进行通信的接口。Java使用JNI框架将输出发送到控制台或与OS库进行交互。