📅  最后修改于: 2023-12-03 15:02:28.383000             🧑  作者: Mango
JVM如何工作 - JVM体系结构
Java虚拟机(JVM)是运行Java程序的核心组件。JVM使Java程序具有跨平台性和难以攻击性。本文将介绍JVM的体系结构,包括JVM的三部分、各个部分的作用以及它们如何协同工作。
JVM的三部分
JVM可以分成三个部分:
- 类加载器(Class Loader)
- 运行时数据区(Runtime Data Area)
- 执行引擎(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线程都有自己的运行时数据区。
运行时数据区可以分成以下几个部分:
- 堆(Heap):存储对象实例
- 方法区(Method Area):存储已加载的类型信息、常量、静态变量、即时编译后的代码等
- 虚拟机栈(Java Virtual Machine Stack):每个Java方法都会创建一个栈帧用于存储局部变量、操作数栈、方法返回值等
- 本地方法栈(Native Method Stack):为Java应用程序使用到的Native方法服务
执行引擎
执行引擎负责执行Java字节码,将Java程序转换成机器代码。
JVM支持两种执行引擎:
- 解释器(Interpreter):逐行解释Java字节码并执行;
- 即时编译器(Just-In-Time Compiler,JIT):将Java字节码编译成本地机器代码,并执行编译后的代码。
JVM会根据方法的被调用次数等因素来选择执行引擎。刚刚开始执行的Java程序会使用解释器执行,随着程序的运行,HotSpot JIT会尝试将频繁调用的方法编译为本地机器代码提高执行效率。
各部分的协同工作
JVM各个部分在执行Java程序时共同协作,下面是它们之间的交互关系:
- 类加载器从磁盘中读入Java类。
- 类加载器检查字节码格式是否符合规范,转换字节码格式至Java虚拟机中的运行时内部表示格式(Internal Representation Format)。
- 类加载器将类初始化(loading)、连接(linking)和初始化(initializing)。
- JVM在运行时数据区的堆中分配内存创建类的对象实例。
- 当Java程序调用方法时,执行引擎将依据方法调用的情况选择执行器:解释器或即时编译器。
- 执行引擎执行Java字节码。
- Java程序结束时,由JVM执行垃圾回收(Garbage Collection)来清除无用的内存空间。
总结
JVM是Java程序的核心组件。JVM有三个部分:类加载器、运行时数据区和执行引擎。类加载器用于加载Java类,运行时数据区存储Java程序的状态,执行引擎负责执行Java程序。三个部分协同工作使得Java程序在任何平台上都能够运行。