栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java虚拟机架构——理解 JVM 内部结构

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java虚拟机架构——理解 JVM 内部结构

前言

每个 Java 开发人员都知道字节码将由JRE(Java 运行时环境)执行。但是很多人不知道JRE是 Java虚拟机(JVM)的实现,它分析字节码、解释代码并执行它。作为开发人员,我们非常有必要了解JVM的体系结构,让我们能够更有效地编写代码。在这篇 JVM 结构解析文章中,我们将更深入地了解Java 中的JVM的结构以及 JVM 的不同组件。

什么是 Java 虚拟机?

虚拟机是物理机的软件实现,Java 是根据在VM上运行的WORA ( Write Once Run Anywhere,一次编写随处运行 ) 的概念开发的。 编译器会将java文件编译成 java .class文件。.class文件是 JVM的输入,JVM 加载并执行类文件。下面是JVM的体系结构:


JVM架构图

JVM 是如何工作的?

如上架构图所示JVM分为三个主要子系统:

1. 类加载器子系统
2. 运行时数据区
3. 执行引擎

1. 类加载器子系统

JVM 的类加载功能由类加载器子系统负责。当它在运行时而不是在编译时第一次引用一个类时,它会加载、链接和初始化该类。它执行三个主要功能,例如:加载、链接和初始化。

1.1 加载

类将由类加载器子系统加载。BootStrap ClassLoader、Extension ClassLoader、Application ClassLoader 是三个实现它的类加载器。

①启动类加载器(Bootstrap ClassLoader): 负责从引导类路径加载类,除了rt.jar。
②扩展类加载器(Extension ClassLoader): 负责加载ext文件夹(jrelib)中的类库。
③应用程序类加载器(Application ClassLoader): 负责加载用户类路径(Classpath)上所指定的类库。
上述类加载器在加载类文件时遵循双亲委派算法。

1.2 链接

验证: 字节码验证器将验证生成的字节码是否正确。
准备: 对于所有静态变量,将被分配内存并赋予默认值。
解析: 将所有符号引用都替换为直接引用。

1.3 初始化

这是类加载的最后阶段,这里将执行类的构造器方法,所有的静态变量都将被分配初始值并执行静态代码块。

2. 运行时数据区

运行时数据区分为 5 个主要部分:

①方法区(Method Area):所有的类信息都将存储在这里,包括静态变量。方法区每个JVM只有一个,它是线程共享的区域。
②堆区(Heap Area):所有对象、数组都将存储在这里(JDK 1.7后字符串常量池也被存放在堆区中)。堆区也是每个JVM只有一个,因为方法区和堆区为多个线程的共享内存,所以存储的数据不是线程安全的。
③栈区(Stack Area):每个线程都会创建一个单独的运行时栈区。每次方法调用时,都将在栈区中创建一个栈帧。所有局部变量都将在栈内存中创建。栈区是线程安全的,因为它是每个线程私有的内存区域。
栈帧分为三个子实体:
局部变量表:与方法相关,方法内的局部变量以及变量对应的值将存储在这里。(注意:一般来说对于引用类型的变量,变量的值存储的是对象在内存中的地址。但经逃逸分析后将对象直接在栈上分配的例外)
操作数栈:如果需要执行任何中间操作,操作数栈充当运行时工作区来执行操作。
帧数据:与方法对应的所有符号都存储在这里。在任何异常的情况下,catch块信息将保存在帧数据中。
④程序计数器(PC Registers): 每个线程都有单独的程序计数器,用于保存当前执行指令的地址,一旦指令执行,程序计数器将更新下一条指令。
⑤本地方法栈(Native Method Stacks): 本地方法栈保存本地方法信息。每个线程都会创建单独的本地方法栈。

3.执行引擎

执行引擎负责读取字节码并一 一执行。

解释器(Interpreter): 读取字节码,解释它并一一执行。解释器更快地解释字节码,但执行速度很慢。解释器的缺点是当一个方法被多次调用时,每次都需要解释。
JIT 编译器(JIT Compiler): JIT 编译器消除了解释器的缺点(一个方法调用多次,每次都需要解释),执行引擎将使用解释器的帮助进行转换,但是当它发现重复的代码时,它使用编译的 JIT 编译器整个字节码并将其更改为本机代码。该本机代码将直接用于提高系统性能的重复方法调用。
中间代码生成器(Intermediate Code generator): 生成中间代码。
代码优化器(Code Optimizer): 代码优化器负责优化上面生成的中间代码
目标代码生成器(Target Code Generator): 目标代码生成器负责生成机器代码。
性能分析器(Profiler): 性能分析器是一个特殊的组件,它负责寻找热点代码,用于识别方法是否被多次调用。
垃圾收集器(Garbage Collector): 垃圾收集器是执行引擎的一部分,它收集并清除未引用的对象。
Java本地接口 (Java Native Interface) : JNI将与本地方法库交互,并提供执行引擎所需的 本地库。
本地方法库(Native Method Libraries): 它是执行引擎所需的本地方法的集合。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号