JVM解释

时间:2020-02-23 14:37:18  来源:igfitidea点击:

本文描述了Java虚拟机(JVM)及其体系结构

JVM代表Java虚拟机。它为我们提供执行编译程序的环境,称为字节码。对于不同的平台,有来自不同供应商的多种JVM实现。本文将介绍JVM的主要组件,包括内存管理和内存管理。

通常我们不会深入研究JVM的内部机制。如果我们的代码可以工作,那么我们就不用太关心内部机制了……直到有一天出了问题,我们需要检查JVM或者修复内存泄漏。

Java虚拟机问题在面试中非常流行。面试官喜欢问关于JVM的各种问题来证明你对Java平台的总体理解。

什么是Java虚拟机

“曾经设计过一种在任何地方运行的Java平台的概念”。这是什么意思?不同于C++的编程语言,例如,代码是针对特定平台编译的,并在其上运行,java源代码首先编译成字节码-a*.class文件。编译后,类文件由虚拟机(VM)解释。请看下面的图表

在不同的平台上运行Java字节码-“只写一次,在任何地方运行”的概念

首先,我们将java源代码(.java文件)编译成字节码(.class文件)。字节码是介于Java和机器语言之间的中间语言。我们可以在任何JVM实现上执行相同的字节码,而无需为一个或者另一个操作系统或者平台调整代码。

Java虚拟机架构

Java虚拟机包括三个主要区域:

  • 类加载器子系统

  • 运行时数据区

  • 执行引擎

类加载器子系统

我们已经在一个单独的教程中介绍了类加载器。我们可能需要查看解释过的Java类装入器以了解更多细节。

加载

编译后的类存储为.class文件。当我们尝试使用一个类时,Java类加载器会将该类加载到内存中。当类在已经运行的类中被名称引用时,它们会被引入Java环境中。在第一个类运行之后,类加载器将在以后尝试加载类。运行第一个类通常是通过声明和使用static main()方法来完成的。

有三种类型的类装入器:

Bootstrap Class Loader–它加载JDK内部类,通常加载rt.jar例如其他核心类java.lang语言.*包类

扩展类装入器——它从JDK扩展目录加载类,通常是JRE的lib/ext目录。

系统类加载器–从系统类路径加载类,可以在使用-cp或者-classpath命令行选项调用程序时进行设置。

连接

链接一个类或者接口涉及到验证和准备该类或者接口、它的直接超类、它的直接上级接口以及它的元素类型(如果需要)。

JVM要求维护以下所有属性:

类或者接口在链接之前已完全加载。

在接口被完全初始化或者验证之前。

在链接过程中检测到的错误将在程序中的某个点引发,此时程序将采取某些操作,这些操作可能直接或者间接地需要链接到错误所涉及的类或者接口。

初始化

类或者接口的初始化包括执行类或者接口初始化方法或者调用类的构造函数。

因为Java虚拟机是多线程的,所以类或者接口的初始化需要小心的同步,因为其他线程可能正在试图同时初始化同一个类或者接口。

这是类加载的最后一个阶段,这里所有的静态变量都将被赋以原始值,并且静态块将被执行。

运行时数据区

运行时数据区域内有五个组件:

方法区

所有类级别的数据都将存储其中包括静态变量。每个JVM只有一个方法区域,它是一个共享资源。

堆区

所有对象及其对应的实例变量和数组都将存储在这里。每个JVM还有一个堆区域。由于方法和堆区域为多个线程共享内存,因此存储的数据不是线程安全的。

堆垛区

对于每个线程,将创建一个单独的运行时堆栈。对于每个方法调用,都会在堆栈内存中生成一个条目,称为堆栈帧。所有局部变量将在堆栈内存中创建。堆栈区域是线程安全的,因为它不是共享资源。堆栈帧分为三个子实体:

Local Variable Array–与方法相关,涉及多少个局部变量,相应的值将存储在这里。

操作数堆栈–如果需要执行任何中间操作,则操作数堆栈充当运行时工作区来执行该操作。

帧数据–与方法对应的所有符号都存储在这里。在任何异常情况下,捕获块信息将保留在帧数据中。

PC寄存器

每个线程将有单独的PC寄存器,以保存当前正在执行的指令的地址一旦指令被执行,PC寄存器将被下一条指令更新。

本机方法栈

本机方法堆栈保存本机方法信息。对于每个线程,将创建一个单独的本机方法堆栈。

执行引擎

分配给运行时数据区的字节码将由执行引擎执行。执行引擎读取字节码并逐段执行。

翻译

解释器解释字节码的速度更快,但执行速度较慢。解释器的缺点是当一个方法被多次调用时,每次都需要一个新的解释。

JIT编译器

JIT编译器消除了解释器的缺点。执行引擎将使用解释器的帮助来转换字节码,但是当它发现重复代码时,它使用JIT编译器,它编译整个字节码并将其更改为本机代码。此本机代码将直接用于重复的方法调用,从而提高系统的性能。

垃圾收集器

垃圾回收器(GC)收集并删除未引用的对象。垃圾回收可以通过调用垃圾回收(),但无法保证执行。JVM的垃圾回收收集所创建的对象。

Java本地接口(JNI)

JNI将与本机方法库交互,并提供执行引擎所需的本机库。

本机方法库

它是执行引擎所需的本机库的集合。