目录
1. 什么是java虚拟机
2. java虚拟机分类
2.1. 商用虚拟机
2.2. 嵌入式虚拟机
3.java虚拟机架构
4.java虚拟机运行过程
1. 什么是java虚拟机
传统意义上的虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的,是操作系统级别的虚拟机。Java虚拟机是一种程序虚拟机,有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
2. java虚拟机分类
2.1. 商用虚拟机
(1)Sun HotSpot
该虚拟机性能优越,是 sun JDK1.3 及以后所有 sun JDK 版本默认的虚拟机,使用最为广泛,一般默认所说的虚拟机就是该虚拟机。
(2)BEA JRockit
JRockit 虚拟机是 BEA 公司于 2002 年从 Appeal Virtual Machines 收购获得的虚拟机。
它是一款面向服务器硬件和服务端使用场景高度优化过得虚拟机,曾经号称是“世界上速度最快的虚拟机”。
由于专注于服务端应用,它的内部不包含解析器的实现,全部代码都靠即时编译器编译后执行。
(3)IBM J9
J9 虚拟机是 IBM 公司单独开发的高性能虚拟机,它并不独立出售,而是作为 IBM 公司各种产品的执行平台,IBM 把它定义为一个可以适应从嵌入式设备到大型企业级应用的、高可移植性的Java运行平台。
(4)Sun Classic
这个虚拟机很原始,是 JDK1.0 时代使用的Java虚拟机,是各种虚拟机的鼻祖,它的内部不存在即时编译器,只能使用纯解释的方式运行。
(5)Sun Exact
这是 Sun 公司在 HotSpot 之外的另一个虚拟机,在 JDK1.2 时代曾短暂的投入过商用,它和 HotSpot 同时开发,但最终被 HotSpot 取代。
(6)Apache Harmony
Harmony 是 Apache 软件基金会主导的、开源的、独立的、实际兼容与 JDK1.5 和 JDK1.6的虚拟机实现,
它间接催生了 Google Android 平台的 Dalvik 虚拟机,Android 的影响力现在有多大不用多说,目前已经是最成功的的数码设备通用平台。
但是由于它的 TCK 授权问题,直接导致 Apache 与 Oracle 的决裂,从而退出了 JCP 组成,这是近代 Java 阵营遇到的最严重的分裂危机。
2.2. 嵌入式虚拟机
(1)Dalvik
Dalvik 虚拟机是 Google 等厂商合作开发的 Android 移动设备平台的核心组成部分之一,它执行 dex(Dalvik Executable) 文件而不是 class 文件,
使用寄存器架构而不是栈架构,但是它的开发体系与Java有着千丝万缕的关系,可以直接使用大部分的 Java API、dex 文件可以直接从class文件转化而来。
并且在 Android 2.2 中提供了即时编译器的实现,性能大大的提高。
(2)KVM
在 Android、IOS 等智能手机操作系统出现之前,曾广泛应用于手机平台的一种虚拟机。
(3)CDC/CLDC HotSpot
CDC和 CLDC HotSpot 分别是 Sun 针对高端嵌入式设备和中低端嵌入式设备的虚拟机,用来代替 KVM。
3.java虚拟机架构
JVM的架构分为三个部分:类加载器、运行时数据区和执行引擎。
(1) 类加载器类加载器是JVM的重要组成部分,它负责将Java类加载到JVM中。类加载器将Java类文件加载到内存中,并将其转换为JVM可以理解的格式。类加载器分为三个层次:启动类加载器、扩展类加载器和应用程序类加载器。启动类加载器是JVM的一部分,它负责加载Java核心类库,如java.lang和java.util等。扩展类加载器负责加载Java扩展类库,如JDBC驱动程序和Java Servlet API等。应用程序类加载器负责加载应用程序的类文件。
(2) 运行时数据区运行时数据区是JVM的内存管理系统,它分为五个部分:方法区、堆、虚拟机栈、本地方法栈和程序计数器。方法区存储类的结构信息、常量池、静态变量和方法代码等。堆是Java程序运行时的内存区域,用于存储对象实例。虚拟机栈用于存储方法的局部变量、操作数栈和返回值等。本地方法栈用于存储本地方法的参数和返回值。程序计数器用于记录当前线程执行的字节码指令地址。
(3) 执行引擎执行引擎是JVM的核心部分,它负责将Java字节码转换为机器码,并执行Java程序。执行引擎分为两个部分:解释器和即时编译器。
解释器将Java字节码逐条解释为机器码,并执行Java程序。即时编译器将Java字节码编译为本地机器码,并执行Java程序。即时编译器可以提高Java程序的执行效率。
4.java虚拟机运行过程
java程序运行过程:字节码文件加载 -> 解释执行/编译执行
简单图:
复杂图: