📜  JVM如何工作–JVM体系结构(1)

📅  最后修改于: 2023-12-03 15:02:28.383000             🧑  作者: Mango

JVM如何工作 - JVM体系结构

Java虚拟机(JVM)是运行Java程序的核心组件。JVM使Java程序具有跨平台性和难以攻击性。本文将介绍JVM的体系结构,包括JVM的三部分、各个部分的作用以及它们如何协同工作。

JVM的三部分

JVM可以分成三个部分:

  1. 类加载器(Class Loader)
  2. 运行时数据区(Runtime Data Area)
  3. 执行引擎(Execution Engine)
类加载器

Java程序由许多类(class)组成。JVM需要将这些类加载到内存中才能执行。类加载器就是加载Java类的组件。

类加载器的任务是:

  • 将类文件读入内存;
  • 检查类的字节码是否符合JVM规范;
  • 将类的字节码转换成Java虚拟机能够理解的格式;
  • 将类加载到内存中。

JVM默认提供了三个类加载器:

  • Bootstrap Class Loader:加载Java的核心类库(比如java.lang包)。
  • Extension Class Loader:加载Java扩展类库(比如javax包)。
  • Application Class Loader:也称为 System Class Loader,用于加载应用程序类。

除了默认的类加载器,开发者还可以创建自定义的类加载器。

运行时数据区

运行时数据区是JVM的内存模型。每个Java线程都有自己的运行时数据区。

运行时数据区可以分成以下几个部分:

  1. 堆(Heap):存储对象实例
  2. 方法区(Method Area):存储已加载的类型信息、常量、静态变量、即时编译后的代码等
  3. 虚拟机栈(Java Virtual Machine Stack):每个Java方法都会创建一个栈帧用于存储局部变量、操作数栈、方法返回值等
  4. 本地方法栈(Native Method Stack):为Java应用程序使用到的Native方法服务
执行引擎

执行引擎负责执行Java字节码,将Java程序转换成机器代码。

JVM支持两种执行引擎:

  • 解释器(Interpreter):逐行解释Java字节码并执行;
  • 即时编译器(Just-In-Time Compiler,JIT):将Java字节码编译成本地机器代码,并执行编译后的代码。

JVM会根据方法的被调用次数等因素来选择执行引擎。刚刚开始执行的Java程序会使用解释器执行,随着程序的运行,HotSpot JIT会尝试将频繁调用的方法编译为本地机器代码提高执行效率。

各部分的协同工作

JVM各个部分在执行Java程序时共同协作,下面是它们之间的交互关系:

  1. 类加载器从磁盘中读入Java类。
  2. 类加载器检查字节码格式是否符合规范,转换字节码格式至Java虚拟机中的运行时内部表示格式(Internal Representation Format)。
  3. 类加载器将类初始化(loading)、连接(linking)和初始化(initializing)。
  4. JVM在运行时数据区的堆中分配内存创建类的对象实例。
  5. 当Java程序调用方法时,执行引擎将依据方法调用的情况选择执行器:解释器或即时编译器。
  6. 执行引擎执行Java字节码。
  7. Java程序结束时,由JVM执行垃圾回收(Garbage Collection)来清除无用的内存空间。
总结

JVM是Java程序的核心组件。JVM有三个部分:类加载器、运行时数据区和执行引擎。类加载器用于加载Java类,运行时数据区存储Java程序的状态,执行引擎负责执行Java程序。三个部分协同工作使得Java程序在任何平台上都能够运行。