19cOCP 9月周末班 正在授课 欢迎试听         RHCE9 9月周末班 正在授课 欢迎试学         PGCE 认证专家,周末班报名中,欢迎垂询         数据库运维工程师招聘         RHCE认证培训钜惠学习         OCP认证培训组团活动特惠中!!!         MySQL认证周末班 正在招生 欢迎垂询!         

JVM 架构解读

更新时间: 2016-10-27 23:09

每个Java开发人员都知道字节码由JRE(Java运行时环境)执行。但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它。作为开发人员,我们应该知道JVM的架构是非常重要的,因为它使我们能够更有效地编写代码。在本文中,我们将更深入地了解Java中的JVM架构和JVM的不同组件。

什么是JVM?

Virtual Machine是物理机器的软件实现。Java是用在VM上运行的WORA(Write Once Run Anywhere)概念而开发的。编译器将Java文件编译为Java .class文件,然后将.class文件输入到JVM中,JVM会加载并执行类文件。下面是JVM的架构图。

 

JVM如何工作?

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

  1. 类加载器子系统

  2. 运行时数据区

  3. 执行引擎

1.类加载器子系统

Java的动态类加载功能由类加载器子系统处理。它在运行时,而不是编译时首次引用类的时候加载、链接、并初始化类文件。

1.1加载

类将通过此组件加载。Boot Strap Class Loader,Extension Class Loader和Application Class Loader是有助于实现的三个类加载器。

  1. Boot Strap Class Loader——负责加载来自于Bootstrap类路径的类,就是rt.jar。此加载程序将给予最高优先级。

  2. Extension Class Loader——负责加载在ext文件夹(jre \ lib)内的类。

  3. Application Class Loader——负责加载应用程序级类路径,路径提到环境变量等

上面的类记载器在加载类文件时遵循Delegation Hierarchy 算法。

1.2链接

  1. 验证——字节码验证器将验证生成的字节码是否正确,如果验证失败,我们将得到verification error。

  2. 准备——对于所有的静态变量,内存将被分配和配置默认值。

  3. 解决——所有的符号存储器引用都将替换为来自Method Area的原始引用。

1.3初始化

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

2.运行时数据区

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

方法区——所有的类级别数据将存储在这里,包括静态变量。每个JVM只有一个方法区,并且它是一个共享资源。

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

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

  1. 局部变量数组——与方法相关,涉及局部变量以及将在此存储的相应值的多少。

  2. 操作数堆栈——如果需要执行任何中间操作,那么操作数堆栈将充当运行时工作空间来执行操作。

  3. 帧数据——对应于方法的所有符号存储在此处。在任何异常的情况下,捕捉块信息将被保持在帧数据中。

PC寄存器——每个线程都有单独的PC寄存器,用于保存当前执行指令的地址,一旦指令执行,PC寄存器将更新到下一条指令。

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

3.执行引擎

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

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

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

  1. 中间代码生成器——生成中间代码

  2. 代码优化器——负责优化上面生成的中间代码

  3. 目标代码生成器——负责生成机器代码或本地代码

  4. 分析器——一个特殊组件,负责查找热点,即该方法是否被多次调用。

垃圾收集器:收集和删除未引用的对象。可以通过调用“System.gc()”触发垃圾收集器,但不能保证执行。JVM的垃圾回收收集创建的对象。

Java本机接口(JNI):JNI将与本地方法库进行交互,并提供执行引擎所需的本地库。

本地方法库:它是执行引擎所需的本地库的集合。

开班信息MORE>>

课程名称 开课时间 上课类型 状态
RHCE培训 11月 周末班 授课中...
OCP培训 10月 周末班 授课中...
PGCE 专家 11月 周末班 报名中...
OCP培训 12月 精英班 报名中...
OCM培训 11月 周末班 报名中...
RHCE培训 常年 周末班 报名中...
MySQL培训 常年 周末班 报名中...
<<