本节内容主要是介绍 JVM 的定义、意义以及虚拟机的发展历程,是本套课程的基础知识部分,也是我们初次握手JVM 的章节。本节主要知识点如下:
-
了解 JVM 的定义,这是我们了解 JVM 概念的基础,为本节的重点之一;
-
了解 JVM 存在的价值及意义,从使用层面了解 JVM 存在的意义,也是本节课程的重点内容;
-
了解 JVM 整体结构,该结构图是从宏观层面,介绍的虚拟机的整体结构模块,后续会对每个模块进行细致的介绍与讲解,此处可视作了解内容,为后续内容的学习奠定基础;
-
了解如何查看自己所使用的 JVM 版本,安装完成 JDK 的学习者,都可以进行查看;
-
了解 JVM ,JRE 和 JDK 三者直接的区别,这是学习 JVM 前需要掌握的基础知识。
本节内容是我们初次了解 JVM,从概念的角度去了解 JVM,为我们后续章节内容的学习打下了良好的基础。
定义: JVM (Java Virtual Machine 简称 JVM),亦可称之为 Java 虚拟机。它是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,它是 Java 最具吸引力的特性之一。
虚拟机:从字面意义上来理解,虚拟机是一个虚拟化出来的计算机。
举个例子:我们经常在 Windows 操作系统上安装 Linux 的虚拟机,然后在 Linux 虚拟机上进行 Shell 脚本的编写练习,那么从这个角度上来说, Linux 虚拟机就类似于 JVM ,不同的是 Linux 虚拟机支撑了 Shell 脚本的运行环境,而 JVM 支撑了 Java 语言的运行。
JVM 是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java 虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JVM 是 Java 语言的一大关键亮点,对于 JVM 的作用,我们这里介绍两个主要的作用,来体现 JVM 的价值所在。
-
跨平台性:Java 语言之所以有跨平台的优点,完全是 JVM 的功劳,跨平台性是 JVM 存在的最大的亮点。
以上一个知识点部分所举出例子来说,Windows 操作系统安装上 JVM 之后,可以支持 Java 程序的运行; Linux 操作系统安装上 JVM 之后,可以支持 Java 程序的运行;同理,Unix 操作系统等等所有我们熟悉的操作系统,安装上 JVM 之后,都可以支持 Java 程序的运行。
这大大提升了 Java 语言的平台灵活性,能够在众多语言争鸣的时代,脱颖而出。
-
优秀的垃圾回收机制: Java 语言的诞生,极大的降低了软件开发人员的学习难度,除了 Java 面向对象编程的特性能够降低学习难度以外,还有一个比较重要的点,就是在进行 Java 编程的时候,可以更少的去考虑垃圾回收机制。
学习过 C 语言的技术人员都能够体会这一点,因为 C 语言编程过程中,要通过代码手动实现内存垃圾的回收与空间释放,这提升了编程的难度,因为考虑内存空间释放,更多的会涉及到底层的知识,这是非常高的一个门槛。从 JVM 的角度来说,JVM 拥有自己的垃圾回收机制,为开发人员分担了部分工作。
Tips:JVM 在 Java 语言中占据了非常重要的地位,学习 JVM 是 Java 技术人员必须要做的事情,目前企业对于 Java 从业者对 JVM 的掌握程度要求非常高,是重点学习内容。
我们知道,如果需要运行 Java 程序,必须要安装 JDK,这说明 JDK 中就包含了支持 Java 语言运行的JVM ,我们来看下如何查看本机的 JVM 信息。
无论是 Windows 操作系统还是 Linux 操作系统,正确安装 JDK 并且配置好环境变量后,在命令行输入如下命令进行查看:
java -version
代码块预览 复制
- 1
以本人的机器为例,可以看到如下的执行结果:
C:\Users\Wayne.WangTJ>java -version java version "1.8.0_191" Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
代码块预览 复制
- 1
- 2
- 3
- 4
我们仔细看下最后一句执行结果,Java HotSpot™ 64-Bit Server VM (build 25.191-b12, mixed mode),这就是我的电脑中 Jvm 虚拟机操作系统的版本。 当然了,安装不同的版本,结果是有所区别的。
三者的定义:我们先来明确下三者的定义,然后说明三者的联系与区别。
- JDK:全称 java development kit ,开发工具包,面向我们的开发者,为开发者提供开发类库,他是 java 的核心。JDK 包含了JRE,一堆工具类(javac、java)以及 Java 的基础类库(Object,string);
- JRE:全称 java runtime environment。包含了JVM 实现和需要的类库。JRE 是一个运行环境,并非开发工具;
- JVM:它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM 有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 语言最重要的特点就是跨平台运行。使用 JVM 就是为了实现跨平台。
如下图所示,我们可以看到 JDK 包含 JRE,JRE 包含 JVM,我们继续来看下边的讲解,彻底了解三者之间的联系与区别。
三者的区别:
- JDK 和 JRE 的区别: JDK 是开发工具包,包含了JRE;JRE 是运行环境,不提供开发工具包。
- JRE 和 JVM 的区别: JRE 包含了JVM,JRE=JVM+lib。JRE 为 class 文件提供了运行的环境,但是需要 JVM 进行 class 文件的翻译,JVM 将翻译好的文件传给 os 系统或者是 CPU 映射指令集,才能够最终完成运行。
三者的联系:三者互相配合不可分割。
JVM 不能够单独的搞定 class 文件,解释 class 的时候,JVM (安装路径\Java\jre1.8.0_144\bin)需要调用我们所需要的类库(安装路径\Java\jre1.8.0_144\lib)。笼统的来说,JVM + lib = JRE。而 JDK 是基于 JRE 基础之上进行的。
总体来说,我们利用 JDK 开发了属于我们自己的程序,通过 JDK 的 javac 工具包进行了编译,将 Java 文件编译成为了 class 文件(字节码文件),在 JRE 上运行这些文件的时候,JVM 进行了这些文件(字节码文件)的翻译,翻译给操作系统,映射到 CPU 指令集或者是操作系统调用,最终完成了我们的代码程序的顺利运行。
本节课程主要是对 JVM 的定义以及作用进行一个简单的介绍,通过对 JVM 的整体结构进行描述,使我们了解了 JVM 的基本情况,为后续的学习奠定良好的基础。