本系列博客我们将以当前默认的主流虚拟机 HotSpot 为例, 详细介绍 Java 虚拟机. 以 JDK1.7 为主, 同时介绍与 JDK1.8 的不同之处, 通过 Oracle 官网以及各种文献进行整理, 并加以验证, 力求保证这块知识的正确性, 完整性.
以下是本系列博客参考的相关文档:
1,JDK1.7 虚拟机规范:
JDK1.8 虚拟机规范:
2,Oracle Java SE 8 产品组件: https://docs.oracle.com/javase/8/docs/index.html
3, 周志明老师:《深入理解 Java 虚拟机: JVM 高级特性与最佳实践》
4, 陈涛老师:《HotSpot 实战》
1,Oracle Java SE 8 产品组件
通过上面给定的地址, 我们可以看到如下这张图:
通常来说 Java 平台标准版 (Java SE) 包括 Java SE 开发工具包 (JDK) 和 Java SE 运行时环境(JRE).
JRE 提供了运行以 Java 编程语言编写的 applet 和应用程序所必需的库, Java 虚拟机和其他组件; JDK 包括 JRE 以及编译器和调试器等命令行开发工具, 可以用来开发 Java 应用程序.
PS:JDK 包含 JRE, 我们通常安装 JDK 的同时也会安装 JRE.
2, 虚拟机
上图的最下一行 Java 虚拟机是被 JRE 所包含, 我们在介绍 Java 虚拟机时, 先了解虚拟机的概念.
所谓虚拟机, 其实就是一台虚拟的机器, 可以用来执行一系列虚拟的命令. 大体上虚拟机可以分为两种: 系统虚拟机和程序虚拟机.
1, 系统虚拟机: 是完全对物理计算机的仿真, 可以说和一台真实的 PC 操作系统没什么区别. 比如常用的 Vmare 以及 Visual Box 软件, 通过这些软件能够模拟出具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统.
2, 程序虚拟机: 专门为执行单个计算程序而产生, 最典型的就是 Java 虚拟机, 在 Java 虚拟机中执行字节码文件命令.
3,Java 虚拟机
了解了什么是虚拟机, 我们再看什么是 Java 虚拟机.
Java 虚拟机可以看做是一台抽象的计算机, 如同真实的计算机那样, 它有自己的指令集以及各种运行时内存区域, 它与 Java 语言没有必然的联系, 只与特定的二进制文件 --class 文件格式关联(字节码文件), 可以通过 Java 语言或者其他语言编写的程序编译成 class 文件, 然后在 Java 虚拟机上运行. Java 虚拟机有以下二个特点:
1, 语言无关
Java 虚拟机只和 class 文件关联, 所以只要你编写程序的语言能够编译成 class 文件, 那么都能够在 Java 虚拟机上运行.
2, 平台无关
Java 从诞生之初就宣传的一个口号: 一次编写, 到处运行.
也就是说 Java 是一个跨平台的语言, 那么 Java 是如何实现跨平台的呢?
其实 Java 之所以跨平台是因为 Java 虚拟机的适配, 不同的系统实现不同的 Java 虚拟机. Java 虚拟机就相当于操作系统和应用程序之间的中介, 每种平台安装适应该平台的 Java 虚拟机, 那么我们编写的程序当然能够在任意平台运行.
4,Java 虚拟机种类
商用虚拟机:
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 阵营遇到的最严重的分裂危机.
嵌入式虚拟机
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.
Java 虚拟机详解(一)------ 简介
来源: http://www.bubuko.com/infodetail-3108734.html